相关疑难解决方法(0)

Python Flask与芹菜在应用程序上下文之外

我正在使用python Flask构建一个网站.一切都很顺利,现在我正在努力实施芹菜.

在我尝试使用来自芹菜的烧瓶邮件发送电子邮件之前,情况也很顺利.现在我得到一个"在应用程序上下文之外工作"的错误.

完全追溯是

  Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/celery/task/trace.py", line 228, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/celery/task/trace.py", line 415, in __protected_call__
    return self.run(*args, **kwargs)
  File "/home/ryan/www/CG-Website/src/util/mail.py", line 28, in send_forgot_email
    msg = Message("Recover your Crusade Gaming Account")
  File "/usr/lib/python2.7/site-packages/flask_mail.py", line 178, in __init__
    sender = current_app.config.get("DEFAULT_MAIL_SENDER")
  File "/usr/lib/python2.7/site-packages/werkzeug/local.py", line 336, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/usr/lib/python2.7/site-packages/werkzeug/local.py", line 295, in _get_current_object
    return self.__local()
  File "/usr/lib/python2.7/site-packages/flask/globals.py", line 26, in _find_app
    raise RuntimeError('working outside of application …
Run Code Online (Sandbox Code Playgroud)

python celery flask

14
推荐指数
2
解决办法
9437
查看次数

访问greenlet里面的flask.g

我正在使用Flask + gevent,并希望在greenlet flask.g的目标函数内访问全局应用程序.我正在使用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'
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

AttributeError: '_AppCtxGlobals' object has no attribute 'user_data'
Run Code Online (Sandbox Code Playgroud)

我认为在复制请求上下文时会推送新的应用程序上下文?我在烧瓶代码中设置跟踪在这里,这似乎是这样.因此,错误并不令人惊讶,因为该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'
Run Code Online (Sandbox Code Playgroud)

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

python gevent flask greenlets

13
推荐指数
1
解决办法
726
查看次数

标签 统计

flask ×2

python ×2

celery ×1

gevent ×1

greenlets ×1