【问题标题】:In a Flask App, where should Celery be instantiated?在 Flask App 中,Celery 应该在哪里实例化?
【发布时间】:2016-10-25 09:15:34
【问题描述】:

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

结构大致如下:

  1. main.py = Flask 应用创建、路由处理和 tasks.delay 调用。
  2. tasks.py = Celery 实例创建和任务定义。
  3. DB = 插入。

我希望一切都在相同的上下文中工作。

【问题讨论】:

标签: python flask celery message-queue


【解决方案1】:

Flask 文档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

【讨论】:

  • 谢谢。我在某处的帖子中读到我需要在启动 Celery 的文件中创建一个 Flask 实例。当我这样做时,它会起作用。但这不是多余的吗?
  • 您的网络服务器与您的 celery 工作人员分开运行,因此拥有两个不同的烧瓶应用程序实例并不是多余的。您可以使用function to create app instances(也称为app factory)来避免代码重复。
  • 是的,我确实做到了。但是,如果我的应用程序嵌套在多级文件夹中,我在导入工厂时会遇到一些麻烦。就像使用蓝图一样。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2022-10-05
  • 1970-01-01
  • 2013-05-09
  • 2015-01-04
相关资源
最近更新 更多