繁体   English   中英

访问greenlet里面的flask.g

[英]Access flask.g inside greenlet

我正在使用Flask + gevent,并希望在flask.g的目标函数内访问flask.g application global。 我正在使用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.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.g 与应用程序上下文绑定 ,而不是在请求上下文中, 正如文档所说

从Flask 0.10开始,它存储在应用程序上下文中,不再存在于请求上下文中......

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,这更清晰。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM