将 celery 与 Flask 应用程序上下文一起使用会导致“弹出错误的应用程序上下文”。断言错误

2024-05-13

我或多或少使用设置来使用您的 Flask 应用程序上下文来运行 Celery 任务:http://flask.pocoo.org/docs/0.10/patterns/celery/ http://flask.pocoo.org/docs/0.10/patterns/celery/

我收到与以下相同的错误消息在 Flask 应用程序中创建、管理和终止后台任务 https://stackoverflow.com/questions/23309052/create-manage-and-kill-background-tasks-in-flask-app

但是,我在执行 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>)

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

Thanks


我知道你发帖已经过去四年了,但我一直在与类似的问题作斗争,除了使用rq not celery.

网络上的每个人都告诉您的是,您需要向您的应用程序添加上下文,例如按照超级教程 https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xxii-background-jobs:

app = create_app()
app.app_context().push()

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

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

def run_async_backup(machine_id):
    app = create_app()
    app.app_context().push()
    # your code for the worker...

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 celery 与 Flask 应用程序上下文一起使用会导致“弹出错误的应用程序上下文”。断言错误 的相关文章

随机推荐