flask1.0.2 factory pattern with celery4.2

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