芹菜烧瓶-无法使用应用程序上下文

Rut*_*rde 8 python message-queue task-queue celery flask

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

APP = Flask(__name__)
APP.config.from_object('config')
Run Code Online (Sandbox Code Playgroud)

我为URL定义了一个视图,在该视图中调用了一个函数,该函数与DB交互。

from tasks import some_func
.
.
.
some_func.delay(params)
Run Code Online (Sandbox Code Playgroud)

在task.py文件中,我正在创建Celery实例,如下所示:

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

现在我得到一个错误,指出:

RuntimeError: Working outside of application context.
Run Code Online (Sandbox Code Playgroud)

我了解了应用程序上下文以及如何使用它们。我已经导入current_app我的tasks.py文件,并使用上下文如下尝试:

@celery.task()
def some_func():
    with current_app.app_context():
        #DB interactions
Run Code Online (Sandbox Code Playgroud)

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

ctx = APP.app_context()
ctx.push()
Run Code Online (Sandbox Code Playgroud)

但是还没有运气。

如何使Celery与Flask配合使用?

注意:我已经在这里尝试了他们的例子

Luk*_*ski 5

上下文: 我在尝试通过Celery任务发送电子邮件时发生了同样的错误。就我而言,我发送的电子邮件是由Flaskhtml 模板呈现的。

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

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

例子:

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)
Run Code Online (Sandbox Code Playgroud)