在我的 Django 项目中,我根本不使用 SQL 数据库,我的主要数据存储是 MongoDB,通过mongoengine。
我想将 Celery 设置为使用 Redis 作为代理和后端。我安装了django-celery-with-redis,安装了 Redis (本地和生产中),并尝试在我的 settings.py 中使用以下内容:
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = BROKER_URL
import djcelery
djcelery.setup_loader()
但是,当我运行 celery 进程并收到要处理的任务时,在返回结果时,它抱怨 settings.DATABASES 配置不正确。这没有多大意义,因为我将 CELERY_RESULT_BACKEND 设置为 Redis。
我发现 djcelery 将后端覆盖djcelery.setup_loader()
到database
: 请参阅源代码中的 DjangoLoader 。
我努力寻找绕过 DjangoLoader 覆盖的方法,我发现的唯一方法是复制djcelery/loaders.py并修改该行:
override_backends = {
'database': 'celery.backends.redis.RedisBackend',
}
然后在我的 settings.py 我做:
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = BROKER_URL
os.environ.setdefault('CELERY_LOADER',
'myproject.utils.ugly_djcelery_hack.DjangoLoader')
注意没有djcelery.setup_loader()
了。
这显然是一个丑陋的黑客,有没有更优雅的方法呢?