본문 바로가기

# Development/Flask

[Flask] Flask에서 Express MiddleWare 사용하기

Express MiddleWare란?

어플리케이션의 요청-응답 사이에서 실행되는 함수, 보통 요청 전 처리 혹은 요청 후 처리에 사용된다.

 


Flask에서 Express MiddleWare를 사용하는 방법

데코레이터 (Decorator)

데코레이터란 함수에 반복적인 기능과 역할을 할 수 있도록 만들어주는 기능이다. 함수 내부 로직 수정 없이 특정 기능을 추가하고 싶을 때 사용한다.

예시로 request 헤더에서 Content-Type을 확인하는 데코레이터를 만들어보자

1. @wraps로 데코레이터로 만들 함수를 정의한다.2. @wraps로 정의 된 함수는 다른 함수를 인자로 받아서 해당 함수가 실행되지 전에 미리 실행한다.3. 인자로 받은 *args, **kwargs를 가져와서 request 데이터를 체크한다.

from flask import request
from functools import wraps

def api_decorator():
    def api_auth_decorator(f):
        @wraps(f)
        def _api_auth_decorator(*args, **kwargs):
            result = f(*args, **kwargs)
            token = request.headers.get("Authorization")
            if token is None:
                return {"message": "허가되지 않은 접근입니다.", }, 401
                        if datetime.datetime.now() >= time_checker(token)
                        # time_checker는 현재 token의 만료기간을 체크하는 임의의 함수입니다
                return {"message": "토큰이 올바르지 않습니다.", }, 401
            return result

        return _api_auth_decorator

    return api_auth_decorator

실제 함수에 데코레이터를 사용하는 방법은 다음과 같다.

@app.route("/test", methods=["POST"])
@api_decorator()
def post_test():
    ...

 

Blueprint

flask 블루프린트에서 데코레이터와 비슷한 기능을 제공한다.

before_first_request

플라스크 서버가 실행되고 가장 첫 요청전에 실행됨

from flask import Flask, Response

app = Flask(__name__)

@app.route("/")
def before_first_request():
    app.logger.info("첫번째 요청")
    return Response(response="before_first_request", status=200)

before_request

매 request 전에 실행됨

from flask import Flask, Response

app = Flask(__name__)

@app.route("/")
def before_request():
    app.logger.info("request 이전")
    return Response(response="before_request", status=200)

after_request

매 request 이후에 실행됨

from flask import Flask, Response

app = Flask(__name__)

@app.route("/")
def after_request():
    app.logger.info("request 이후")
    return Response(response="after_request", status=200)

Blueprint에서 실행

from flask import Blueprint, Response
from request import before_request, after_request, before_first_request

bp = Blueprint("test", __name__)

api.before_request(before_request)
api.after_request(after)

@bp.route('/GET', methods=['GET'])
def test_get():
    return Response(response="test", status=200)

return

 

<참고>

- https://www.woolog.dev/backend/flask/using-flask-with-decorator/

- https://blog.namthplayground.com/7