如何将参数传递给after_request?
我刚开始学习Flask,正在了解 @app.after_request
和 @app.teardown_appcontext
这两个东西。我有一个装饰器视图,它使用了一个参数 data
(这是一个对象)。
@app.route('/api/me')
@oauth.require_oauth()
def me(data):
user = data.user
return jsonify(username=user.username)
在这个视图(还有很多其他视图)执行完之后,我想更新我的数据库,但我需要访问变量 data
。我该如何通过 @app.after_request
或 @app.teardown_appcontext
来实现呢?
@app.after_request
def record_ip(response):
client = data.client # needs access to "data"
.... log stuff in my database ...
return response
1 个回答
9
你可以把这个对象添加到 flask.g
这个全局对象里:
from flask import g
@app.route('/api/me')
@oauth.require_oauth()
def me(req):
user = req.user
g.oauth_request = req
return jsonify(username=user.username)
@app.after_request
def record_ip(response):
req = g.get('oauth_request')
if req is not None:
client = req.client # needs access to "req"
# .... log stuff in my database ...
return response
全局的 flask.g
上下文是线程安全的,并且和当前的请求是绑定在一起的;引用一下 文档中的内容:
应用上下文会根据需要创建和销毁。 它不会在不同的线程之间移动,也不会在不同的请求之间共享。