我正在用python开发一些基本的REST API。我期望所有请求的标头中都有一个授权令牌,除了一些不安全的请求(如登录和注册)外。我正在@ app.before_request中验证令牌,然后要将解码的有效负载传递给相应的端点视图函数。但是,我不会将解码的信息附加到请求对象,因为会收到“ TypeError:'请求'对象不支持项目分配”。
@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 !"})
我在想这种实现就像一个auth过滤器,其中所有请求都通过该过滤器。我可以在这一层本身处理恶意请求,也可以获取网络中间件中需要的用户特定信息。
答案 0 :(得分:0)
我有一个相似的用例(实际上令人惊讶地相似)。我通过在请求对象中设置自定义属性来解决该问题,就像您的方法一样,尽管我不是使用直接分配(即request["token"]=token
),而是使用setattr(request, "token", token)
。
我从瓶子插件中获得了提示,该插件的功能非常相似: https://github.com/agile4you/bottle-jwt/blob/master/bottle_jwt/auth.py#L258
您甚至可以尝试使用该插件或其他一些插件来进一步改善您的应用程序。