将应用程序上下文传递到flask fram中的芹菜

2024-04-25 11:35:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着在我现有的烧瓶项目中加入芹菜。添加之后,我在运行时遇到了一个“在应用程序上下文之外工作”的错误。看来芹菜工人缺少我的应用程序上下文。但我不知道在这个例子中,该把应用程序上下文传递给芹菜工人。在

以下是我当前的结构(我尝试使用蓝图和api文档遵循工厂模式):

-run.py
-app
    -module1
      -controller.py
      -model.py
      -service.py
    -__init__.py
    -config.py

为了初始py在

^{pr2}$

为了运行.py在

from app import create_app
app = create_app()
if __name__ == '__main__':
    app.run(threaded=True, debug=True)

为了服务.py在

from app import db, celery
@celery.task(bind=True)
def service1(self):
    # do somethigng & return

为了控制器.py在

from flask import Blueprint
from flask_restplus import Api, Resouce
blueprint = Blueprint('service', __name__)
apis = Api(app = blueprint)
ns = apis.namespace('service', 'service description')
@ns.route("/")
class SomeList(Resource):
    def get(self):
        service1.apply_async()
        # return

Tags: runnamefrompyimportselftrueapp
1条回答
网友
1楼 · 发布于 2024-04-25 11:35:02

我认为这种混淆是基于这样一个事实:您试图将应用程序上下文“传递”给芹菜工人。实际上,烧瓶过程不能将上下文传递给工人,因为它们是不同的进程。Celery工作进程需要通过调用create_app()创建自己的Flask应用程序实例,以便在需要时推送自己的应用程序上下文。在

例如,在您的service1任务中:

from app import db, celery, create_app

@celery.task(bind=True)
def service1(self):
    app = create_app()
    with app.app_context():
        # do somethigng & return

为了提高效率,您可以创建一个由所有任务共享的全局app

^{pr2}$

相关问题 更多 >

    热门问题