在我的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进程并且收到要处理的任务时,在返回结果时,它抱怨设置错误.DATABASES配置不正确。因为我将CELERY_RESULT_BACKEND设置为Redis,所以没有多大意义。
我发现djcelery会将djcelery.setup_loader()
后端覆盖到database
:请参阅source code中的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()
。
这显然是一个丑陋的黑客,有更优雅的方式吗?
答案 0 :(得分:2)
您不能将redis
设为CELERY_RESULT_BACKEND
吗?请参阅the docs以供参考。
django-celery
会覆盖默认celery.backends.database
,原因很简单:您根本无法将SQLAlchemy
与Django ORM
一起使用。我认为将database
后端路由到redis
没有意义。