greyli / helloflask

Hello, Flask!
https://docs.helloflask.com
MIT License
1.87k stars 2.53k forks source link

celery的工厂函数的使用方法 #231

Closed diklios5768 closed 3 years ago

diklios5768 commented 3 years ago

python 3.9.2,celery 5.0.5,redis 3.5 最近学到了celery,想把它加入工厂函数中,这样可以根据环境变量执行 app文件夹下的__init__.py是工厂函数,按照网上和作者之前给出的教程,工厂函数如下:

from flask import Flask
from celery import Celery

celery = Celery(__name__, broker='redis://localhost:6379/0',backend='redis://localhost:6379/0')

def create_app():
    app = Flask(__name__)

    register_celery(app)
    return app

def register_celery(app):
    # 这里本来还有加载配置的,但是按道理来说不加载也能执行,因为初始化的时候定义好了
    class ContextTask(celery.Task):
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return self.run(*args, **kwargs)

    celery.Task = ContextTask

其他需要使用celery的文件引入方法from app import celery,之后调用方法完全是按官方的写法,无论是__init__.py同一个目录还是次级目录,全部都会报错,即使是最简单的自定义add函数也无法执行。 不是有循环导入,就是没注册这个函数的错误,要么任务接受了根本不执行,目前所有成功的写法都是app和celery在一个文件中,希望作者能够更新更新一个实例,之前2019年的文章我看过了,基本已经失效,解决一个问题,还会出现新的问题。

之前还有人说过关掉debug模式的,试过了都没有用