在使用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参数来确认访问当前路由用户的身份。