celery之前的版本和flask工厂模式一起使用很麻烦。因为celery没有提供init_app()这样的方法,celery4.2之前的版本用法参照这个博客Celery and the Flask Application Factory Pattern写的可以说是很详细了。
celery 4.2 有个很大的变化,就是实例化的时候可以不提供broker参数。
celery = Celery(__name__)
先这样就行了。虽然这个时候创建的实例还是有个默认的broker.但是配置里面可以重新覆盖…。
然后在create_app的方法里面配置:
import celeryconfig
def create_app(config_name):
celery.config_from_object(celeryconfig)
celery4.2推荐所有配置项小写。所以celery的配置文件单独开来,不跟flask的配置放一起,新建一个文件叫celeryconfig.py
## Broker settings.
broker_url = 'redis://localhost:6379'
一般celery的任务都要用到flask运行时环境。所以create_app()里面还要加以下代码
class ContextTask(celery.Task):
def __call__(self, *args, **kwargs):
with app.app_context():
return self.run(*args, **kwargs)
celery.Task = ContextTask
这段代码的主要目的是通过重写celery.Task给celery加上flask app_context()
最后在app.py文件里面import celery
import os
from app import create_app, db, celery
app = create_app(os.getenv('CONFIG') or 'default')
通过以下命令就可以启动celery任务啦
celery -A app.celery worker -l info