【问题标题】:Access flask application context from within greenlet从 greenlet 中访问烧瓶应用程序上下文
【发布时间】:2015-03-11 01:56:00
【问题描述】:

我有一个烧瓶脚本命令,它产生一长串绿色小菜。问题是,这些 greenlet 无法访问我的应用程序上下文。我得到一个 "> 始终出现 RuntimeError 失败(访问 app.logger,例如)。建议?

关于我的尝试: spawn(方法, 应用程序, arg1, arg2)

def spawn(app, arg1, arg2):
    with app.app_context():
        app.logger.debug('bla bla') # doesn't work
        ... do stuff

【问题讨论】:

    标签: flask gevent greenlets


    【解决方案1】:

    编辑:下面允许您访问request 对象,但不能访问current_app,可能不是您要搜索的内容。

    您可能正在寻找flask.copy_current_request_context(f) 记录在这里:http://flask.pocoo.org/docs/0.10/api/#flask.copy_current_request_context

    例子:

    import gevent
    from flask import copy_current_request_context
    
    @app.route('/')
    def index():
        @copy_current_request_context
        def do_some_work():
            # do some work here, it can access flask.request like you
            # would otherwise in the view function.
            ...
        gevent.spawn(do_some_work)
        return 'Regular response'
    

    【讨论】:

    • 谢谢埃米尔。实际上,我必须从我的 flask-script 命令中覆盖 call 方法才能使事情正常进行。 xP太少我可能大惊小怪了~
    【解决方案2】:

    您可以传递请求中相关信息的副本,例如

    import gevent
    
    @app.route('/')
    def index():
        def do_some_work(data):
            # do some work here with data
            ...
        data = request.get_json()
        gevent.spawn(do_some_work, data)
        return 'Regular response'
    

    【讨论】:

    • 如果do_some_work 中的任何内容需要应用程序上下文,这将不起作用。如果您使用的是 flask-sqlalchemy、flask-pymongo 等,这包括任何数据库访问。
    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 2021-11-27
    • 2020-06-16
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    相关资源
    最近更新 更多