Djcelery强制使用'数据库'后端,如何正确绕过它?

时间:2013-07-17 08:19:41

标签: django redis celery djcelery

在我的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()

这显然是一个丑陋的黑客,有更优雅的方式吗?

1 个答案:

答案 0 :(得分:2)

您不能将redis设为CELERY_RESULT_BACKEND吗?请参阅the docs以供参考。

django-celery会覆盖默认celery.backends.database,原因很简单:您根本无法将SQLAlchemyDjango ORM一起使用。我认为将database后端路由到redis没有意义。