1

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

这显然是一个丑陋的黑客,有没有更优雅的方法呢?

4

1 回答 1

2

你不能设置redisCELERY_RESULT_BACKEND吗?请参阅文档以供参考。

django-celery有充分的理由覆盖默认值celery.backends.database:您根本不能使用SQLAlchemywith Django ORM。我认为将database后端路由到redis.

于 2013-07-17T13:07:39.277 回答