Celery与芹菜 - 应用程序上下文不可用

时间:2016-06-21 15:17:49

标签: python flask celery message-queue task-queue

我有一个Flask应用程序,注册如下:

APP = Flask(__name__)
APP.config.from_object('config')

我已经为URL定义了一个视图,其中调用了一个与DB交互的函数。

from tasks import some_func
.
.
.
some_func.delay(params)

在tasks.py文件中,我创建了一个Celery实例,如下所示:

# Config values don't work here
celery = Celery('tasks', broker='amqp://', backend='amqp://')
.
.
.
@celery.task()
def some_func():
    #DB interactions

现在我收到一条错误消息:

RuntimeError: Working outside of application context.

我阅读了有关应用程序上下文以及如何使用它们的信息。我已在current_app文件中导入tasks.py并尝试使用上下文:

@celery.task()
def some_func():
    with current_app.app_context():
        #DB interactions

但是我仍然得到同样的错误。我也尝试从主文件中推送上下文,如下所示:

ctx = APP.app_context()
ctx.push()

但是没有运气。

如何让Celery与Flask合作?

注意:我已经尝试了example here

1 个答案:

答案 0 :(得分:2)

上下文: 尝试通过Celery任务发送电子邮件时,我遇到了同样的错误。 就我而言,我正在发送由Flask使用html模板呈现的电子邮件。

原因: CeleryFlask已断开连接。因此,Celery对Flask的应用程序上下文一无所知。我不得不手动注入应用程序上下文。

解决方案: 对我有用的是Flask的app_context()函数。只需在错误源自的函数周围插入/包装应用程序上下文。

示例:

from app import app
from app import mail

@celery.task
def sign_up_task(**config, **context):
    mail = Mail()
    with app.app_context():
        mail.send(**config, **context)