在Flask应用程序中,Celery应该在哪里实例化?

时间:2016-06-23 07:22:47

标签: python flask celery message-queue

我有一个Flask应用程序,这是一个非常基本的应用程序,带有POST处理程序和一些数据库插入。使用Celery将DB插入设置为任务。如果我将Celery实例创建和任务定义放在tasks.py文件中,并从我的main.py文件(也创建了Flask应用程序)调用函数,我会得到out of context errortasks.py文件中的任务依次调用执行数据库插入的DB类。如何正确创建Celery实例并确保它具有Flask上下文?

结构大致类似于:

  1. main.py = Flask应用创建,路由处理和tasks.delay调用。
  2. tasks.py = Celery实例创建和任务定义。
  3. DB =插入。
  4. 我希望一切都在同一个环境中发挥作用。

1 个答案:

答案 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