如何将参数传递给 after_request?

use*_*829 5 python flask

我是 Flask 的新手,正在学习@app.after_request@app.teardown_appcontext。我有一个带参数的 oauthlib装饰视图data(这是一个对象)。

@app.route('/api/me')
@oauth.require_oauth()
def me(data):
    user = data.user
    return jsonify(username=user.username)
Run Code Online (Sandbox Code Playgroud)

执行此视图(以及许多其他视图)后,我想更新我的数据库,但需要访问变量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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

您可以将对象添加到flask.gglobals 对象

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
Run Code Online (Sandbox Code Playgroud)

全局flask.g上下文是线程安全的并绑定到当前请求;从文档中引用:

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