gpt4 book ai didi

python - 在 flask 框架中将应用程序上下文传递给 celery

转载 作者:行者123 更新时间:2023-12-05 03:00:24 25 4
gpt4 key购买 nike

我尝试将 celery 添加到我现有的 flask 项目中。添加后,运行时出现“在应用程序上下文之外工作”错误。 celery worker 似乎缺少我的应用程序上下文。但在这种情况下,我不确定在哪里将应用程序上下文传递给 celery worker。

这是我当前的结构(我尝试遵循带有蓝图和 api 文档的工厂模式):

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

对于 init.py

# __init__.py
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
from app.config import Config
from flask_restplus import Api
from celery import Celery

cors = CORS()
db = SQLAlchemy()
api = Api()
celery = Celery(__name__, broker=Config.CELERY_BROKER_URL, include=["app.module1.service"])

def create_app(config_class = Config):
app = Flask(__name__, static_url_path='')
app.config.from_object(Config)

cors.init_app(app)
db.init_app(app)
api.init_app(app=app)
celery.conf.update(app.config)

from app.module1.controller import blueprint
from app.module1.controller import ns

app.register_blueprint(blueprint)
api.add_namespace(ns)

return app

对于run.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

对于controller.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

最佳答案

我认为混淆是基于您试图将应用程序上下文“传递”给 Celery 工作人员这一事实。实际上,Flask 进程无法将上下文传递给 worker,因为它们是不同的进程。 Celery worker 进程需要通过调用 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:

from app import db, celery, create_app
app = create_app()

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

关于python - 在 flask 框架中将应用程序上下文传递给 celery ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56880168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com