Flask app middleware

在使用flask框架开发web app时,需要通过中间件处理某些流程时,要么采用第三方库,也可以通过自定义装饰器的方式来实现。

比如,某些特定路由必须先登录才能访问,常规的处理方式是通过中间件来验证请求中附带的jwt token,解析token并获取用户身份信息,验证通过后放行。

from flask import request, make_response
from functools import wraps

def login_required(func):
    @wraps(func)
    def decorator(*args, **kwargs):
        token = None
        user_id = None
        if 'Authorization' in request.headers:
            token = request.headers['Authorization'][7:]

        if not token:
            return make_response({'code': 401, 'msg': 'Unauthorized'}, 401)

        try:
            # todo: decode jwt token
            # token_decoded = jwt.decode(token)
            user_id = int(token_decoded.get('user_id'))

        except Exception as e:
            return make_response({'code': 403, 'msg': str(e)}, 403)
        return func(user_id, *args, **kwargs)
    return decorator

然后我们在需要通过身份验证后才能访问的路由上加上该装饰器,同时该函数接受一个user_id参数

@app.route('/some_route', methods=['GET'])
@login_required
def some_api(user_id: int):
    pass

至此,在该路由函数中就可以通过传入的user_id参数来确认访问当前路由用户的身份。

Copyright @lionared