在Flask应用程序上下文中使用celery会显示"弹出错误的应用程序上下文".Asse田

gre*_*les 5 python celery flask python-2.7

我或多或少地使用安装程序从这里使用您的烧瓶应用程序上下文来运行Celery任务:http://flask.pocoo.org/docs/0.10/patterns/celery/

我收到与创建,管理和杀死烧瓶应用程序中的后台任务相同的错误消息

但是,我在正在执行Celery任务的实际工作中得到它.这是跟踪:

worker_1 | Traceback (most recent call last):
worker_1 |   File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 240, in trace_task
worker_1 |     R = retval = fun(*args, **kwargs)
worker_1 |   File "/code/app/__init__.py", line 42, in __call__
worker_1 |     return TaskBase.__call__(self, *args, **kwargs)
worker_1 |   File "/usr/local/lib/python2.7/dist-packages/flask/ctx.py", line 186, in __exit__
worker_1 |     self.pop(exc_value)
worker_1 |   File "/usr/local/lib/python2.7/dist-packages/flask/ctx.py", line 178, in pop
worker_1 |     % (rv, self)
worker_1 | AssertionError: Popped wrong app context.  (<flask.ctx.AppContext object at 0x47a5790> instead of <flask.ctx.AppContext object at 0x427e390>)
Run Code Online (Sandbox Code Playgroud)

有人有主意吗?在应用程序上下文中运行应该解决这个问题,而不是创建它!

谢谢

ilm*_*moi 2

我知道距离您发帖已有 4 年了,但除了使用rqnot之外,我一直在与类似的问题作斗争celery

网络上的每个人都告诉您的是,您需要向您的应用程序添加上下文,例如按照Supertutorial

app = create_app()
app.app_context().push()
Run Code Online (Sandbox Code Playgroud)

他们没有告诉您的是,如果此文件中有任何其他内容会导致应用程序的主实例打开它(例如另一个函数),那么您将点击上面的两行并收到错误。

我的解决方案是将这两行放在我要卸载给工作人员的实际异步函数中,如下所示:

def run_async_backup(machine_id):
    app = create_app()
    app.app_context().push()
    # your code for the worker...
Run Code Online (Sandbox Code Playgroud)

这意味着主实例不会命中它们 - 而工作线程会命中它们(假设只有工作线程调用此函数)。