我可以在@app.before_request中为我的flask请求对象附加一个值,并将其转发给端点视图函数吗



我正在python中开发一些基本的RESTAPI。除了一些不安全的请求(如登录和注册(之外,我希望在所有请求的标头中都有一个授权令牌。我正在@app.before_request中验证令牌,然后我想将解码的有效载荷传递给相应的端点视图函数。但是,我不会将解码的信息附加到请求对象,因为我得到"TypeError:'request'对象不支持项目分配"。

@app.before_request
def before_request():
print(request.endpoint)
if request.endpoint=="register" or request.endpoint=="login":
pass
else:
auth_header = request.headers.get('Authorization')
if auth_header:
auth_token = auth_header.split(" ")[1]
token=decode_auth_token(auth_token)
request["token"]=token
else:
return jsonify({"result":"","error":"No token present in header !"})

我认为这个实现就像一个身份验证过滤器,所有请求都通过这个过滤器。我可以在这一层删除恶意请求,还可以获取网络中间件中所需的用户特定信息。

我有一个类似的用例(实际上惊人地相似(。我通过在请求对象中设置一个自定义属性来绕过它,这与您的方法非常相似,尽管我没有使用直接赋值(即request["token"]=token(,而是使用了setattr(request, "token", token)

我从一个瓶子插件那里得到了提示,它做了一些非常类似的事情:https://github.com/agile4you/bottle-jwt/blob/master/bottle_jwt/auth.py#L258

你甚至可能想尝试一下,或者其他一些插件来进一步改进你的应用程序。

Flask提供g在应用程序上下文中传播数据。

from flask import g
@app.before_request
def before_request():
g.token = vaue
@bp.route("/path", methods=["GET"]):
g.token

参考:

  • https://flask.palletsprojects.com/en/2.2.x/appcontext/

最新更新