我或多或少地使用设置从此处使用您的烧瓶应用上下文运行Celery任务:http://flask.pocoo.org/docs/0.10/patterns/celery/
我收到与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>)
有人有什么想法吗?在应用程序上下文中运行应该解决这个问题,而不是创建它!
由于
答案 0 :(得分:0)
我知道距您发布已经有4年了,但是我正在使用rq
而不是celery
来解决类似的问题。
网络上每个人都告诉您,您需要向应用程序添加上下文,例如,按照Supertutorial:
app = create_app()
app.app_context().push()
他们没有告诉您的是,如果此文件中还有其他任何东西会导致您的应用主实例打开它(例如另一个功能),那么您将点击上面的两行并获得错误。
我的解决方案是将两行放在我要分派给这样的工作程序的实际异步函数中:
def run_async_backup(machine_id):
app = create_app()
app.app_context().push()
# your code for the worker...
这意味着主实例将不会命中它们,而辅助对象将被击中(假定只有辅助对象调用了此函数)。