首页 文章

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

提问于
浏览
3

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

这就是结构大致类似于:

  • main.py = Flask应用创建,路由处理和tasks.delay调用 .

  • tasks.py = Celery实例创建和任务定义 .

  • DB =插入 .

我希望一切都在同一个环境中运作 .

1 回答

  • 1

    Flask docs suggest继承Celery的Task类并在Flask应用程序上下文中包装任务执行 . 所以在_1716396中如果您的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
    

相关问题