如何将参数传递给after_request?

5 投票
1 回答
3744 浏览
提问于 2025-04-17 21:20

我刚开始学习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 上下文是线程安全的,并且和当前的请求是绑定在一起的;引用一下 文档中的内容:

应用上下文会根据需要创建和销毁。 它不会在不同的线程之间移动,也不会在不同的请求之间共享。

撰写回答