gpt4 book ai didi

python - 在 greenlet 中访问 flask.g

转载 作者:太空狗 更新时间:2023-10-29 17:33:35 25 4
gpt4 key购买 nike

我正在使用 Flask + gevent 并想访问 flask.g greenlet 的目标函数内的全局应用程序。 我正在使用 copy_current_request_context装饰器,并且情况与文档中给出的示例非常相似:

import gevent
from flask import copy_current_request_context, g

@app.route('/')
def index():
g.user_data = 'foobar'
g.more_user_data = 'baz'

@copy_current_request_context
def do_some_work():
some_func(g.user_data, g.more_user_data)
...

gevent.spawn(do_some_work)
return 'Regular response'

但是,我收到以下错误:

AttributeError: '_AppCtxGlobals' object has no attribute 'user_data'

我认为复制请求上下文时会推送一个新的应用程序上下文?我在 Flask 代码中设置了一个跟踪 here似乎是这样。所以错误并不那么令人惊讶,因为 flask.g 对象是 0.10 范围内的应用程序上下文(参见 http://flask.pocoo.org/docs/0.12/api/#flask.Flask.app_ctx_globals_class )。

显然,我可以将用户数据作为参数传递给目标函数:

import gevent
from flask import g

@app.route('/')
def index():
g.user_data = 'foobar'
g.more_user_data = 'baz'

def do_some_work(user_data, more_user_data):
some_func(user_data, more_user_data)
...

gevent.spawn(do_some_work, g.user_data, g.more_user_data)
return 'Regular response'

这工作得很好,但我希望尽可能使用 flask.g

最佳答案

flask.gbound with the app context ,不在请求上下文中,as the doc says :

Starting with Flask 0.10 this is stored on the application context and no longer on the request context ...

copy_current_request_context() 只复制请求上下文,但给你一个新的应用程序上下文。您可以创建一个通过闭包传递当前应用程序上下文:

def copy_current_app_context(f):
from flask.globals import _app_ctx_stack
appctx = _app_ctx_stack.top
def _(*args, **kwargs):
with appctx:
return f(*args, **kwargs)
return _

但是,我更喜欢通过参数显式地将数据传递给 greenlet,这样更简洁。

关于python - 在 greenlet 中访问 flask.g,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47384600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com