프로그래밍/Python

Flask 특정 조건 시, 특정 정보만 응답하는 방법

채윤아빠 2025. 3. 9. 00:02

개요

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_MODETrue일 경우, 모든 요청에 대해 점검 메시지를 반환하고, 해당 요청은 각 라우트 함수에 도달하지 않습니다.


조건을 더 정교하게 구성하기

조건은 단순한 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_requestteardown_request 등도 활용할 수 있으나, 응답을 완전히 차단하려면 before_request가 가장 적절합니다.
  • JSON이 아닌 HTML을 반환해야 하는 경우, render_template()를 사용하면 됩니다.

맺는말

서비스 운영 중에는 일시적인 점검이나 시스템 제한이 필요한 경우가 종종 있습니다. 이럴 때 Flask의 before_request 훅을 이용하면, 모든 라우트에 일괄적으로 동일한 응답을 반환하는 로직을 간결하게 구성할 수 있습니다.

이 방식은 서비스 점검 페이지, 일시적인 API 차단, 접근 권한 제어 등 다양한 상황에서 유용하게 활용될 수 있으니 참고하시기 바랍니다.



728x90
반응형