개요
Flask는 Python 기반의 경량 웹 프레임워크로, 라우팅이 매우 직관적으로 구성되어 있어 다양한 방식으로 요청을 처리할 수 있습니다. 이번 글에서는 특정 조건이 만족될 경우, 모든 경로(route)에 대해 하나의 고정된 응답만 반환하도록 구성하는 방법에 대해 소개합니다.
예를 들어, 시스템 점검 중일 때 모든 사용자 요청에 대해 "서비스 점검 중입니다" 메시지를 반환하고 싶을 때 유용합니다.
기본 라우트 구성
우선 일반적인 Flask 라우트 구조를 살펴보겠습니다.
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def index():
return jsonify({"message": "Hello, World!"})
@app.route('/about')
def about():
return jsonify({"message": "This is the about page."})
공통 조건 처리: before_request
훅 사용
Flask는 요청 처리 흐름 중에 특정 함수를 미리 실행할 수 있도록 하는 before_request
데코레이터를 제공합니다. 이를 활용하면, 요청 경로에 상관없이 모든 요청에 대해 공통 조건을 체크하고 필요한 응답을 선제적으로 반환할 수 있습니다.
from flask import Flask, jsonify, request
app = Flask(__name__)
# 시스템 점검 여부 설정 (True일 경우 모든 요청 차단)
MAINTENANCE_MODE = True
@app.before_request
def check_maintenance_mode():
if MAINTENANCE_MODE:
return jsonify({
"status": "error",
"message": "현재 서비스 점검 중입니다. 잠시 후 다시 시도해주세요."
}), 503 # 503 Service Unavailable
@app.route('/')
def index():
return jsonify({"message": "Hello, World!"})
@app.route('/about')
def about():
return jsonify({"message": "This is the about page."})
위 코드에서는 MAINTENANCE_MODE
가 True
일 경우, 모든 요청에 대해 점검 메시지를 반환하고, 해당 요청은 각 라우트 함수에 도달하지 않습니다.
조건을 더 정교하게 구성하기
조건은 단순한 Boolean뿐만 아니라, 다양한 기준(예: 특정 IP, 헤더 값, 시간대 등)을 기준으로 설정할 수 있습니다.
예: 특정 관리자 IP만 우회 가능하게 설정
ALLOWED_IP = '123.123.123.123'
@app.before_request
def check_maintenance_mode():
client_ip = request.remote_addr
if (MAINTENANCE_MODE and (client_ip != ALLOWED_IP)):
return jsonify({
"status": "error",
"message": "현재 서비스 점검 중입니다."
}), 503
참고사항
before_request
는 요청이 라우트 함수에 도달하기 전에 실행되므로, 효율적인 조건 체크에 적합합니다.- 동일한 방식으로
after_request
나teardown_request
등도 활용할 수 있으나, 응답을 완전히 차단하려면before_request
가 가장 적절합니다. - JSON이 아닌 HTML을 반환해야 하는 경우,
render_template()
를 사용하면 됩니다.
맺는말
서비스 운영 중에는 일시적인 점검이나 시스템 제한이 필요한 경우가 종종 있습니다. 이럴 때 Flask의 before_request
훅을 이용하면, 모든 라우트에 일괄적으로 동일한 응답을 반환하는 로직을 간결하게 구성할 수 있습니다.
이 방식은 서비스 점검 페이지, 일시적인 API 차단, 접근 권한 제어 등 다양한 상황에서 유용하게 활용될 수 있으니 참고하시기 바랍니다.
'프로그래밍 > Python' 카테고리의 다른 글
[python] 쉘의 파이프 "|"를 subprocess.Popne()으로 처리하는 방법 (0) | 2025.04.14 |
---|---|
PyInstaller - "ModuleNotFoundError: No module named 'debugpy'" 문제 해결하기 (0) | 2025.04.09 |
[python] bytearray 초기화하기 (0) | 2025.02.19 |
[python] 'await'가 없다면 어떻게 될까? - 구체적인 예제 (0) | 2024.11.06 |
[python] `await` 키워드의 의미와 역할 (0) | 2024.11.01 |