我有一个Flask应用程序,这是一个非常基本的应用程序,带有POST处理程序和一些数据库插入。使用Celery将DB插入设置为任务。如果我将Celery实例创建和任务定义放在tasks.py
文件中,并从我的main.py
文件(也创建了Flask应用程序)调用函数,我会得到out of context error
。 tasks.py
文件中的任务依次调用执行数据库插入的DB类。如何正确创建Celery实例并确保它具有Flask上下文?
结构大致类似于:
我希望一切都在同一个环境中发挥作用。
答案 0 :(得分:1)
Flask docs suggest子类化Celery的Task类并在Flask应用程序上下文中包装任务执行。因此,在task.py
中,如果您的Flask应用实例名为app
且您的Celery实例名为celery
,则您将使用新子类替换celery
的Task属性:
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask