【问题标题】:Djcelery forces the use of 'database' backend, how to properly bypass it?Djcelery 强制使用“数据库”后端,如何正确绕过它?
【发布时间】:2013-07-17 08:19:40
【问题描述】:

在我的 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:请参阅 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() 了。

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

【问题讨论】:

    标签: django redis celery djcelery


    【解决方案1】:

    您不能将redis 设置为CELERY_RESULT_BACKEND 吗?参考the docs

    django-celery 覆盖默认 celery.backends.database 有一个很好的理由:您根本不能将 SQLAlchemyDjango ORM 一起使用。我认为将database 后端路由到redis 毫无意义。

    【讨论】:

    • 我试过CELERY_RESULT_BACKEND = 'redis',效果一样。设置此变量的推荐方式实际上是整个 Redis URL,参见the docs again。你能解释一下你的第二段吗?据我所知,这里不涉及 SQLAlchemy。
    • 我已经为您指出了正是为此目的的文档——不必描述如何配置后端。这不仅是推荐的方式,也是唯一的方式。此外,通常celery.backends.databaseSQLAlchemy 后端。所有django-celery 所做的只是用基于Django ORM 的后端替换它。再次,请参阅docs。关于连接链接,有一个指向SQLAlchemy 文档的链接。
    • 现在我明白你的意思了,是的,我同意将 database 后端路由到 redis 是不好的(IMO 丑陋的黑客攻击)。我认为这里的问题实际上是 djcelery/loaders.py 中的 DjangoLoader 还没有看到 settings.py 变量。在DjangoLoader.read_configuration 中,它尝试获取设置属性,并且我使用打印语句检查它是None。所以问题是如何让loader从settings.py中获取配置。
    • 您是否尝试在执行 read_configuration 时内省 settings 包含的内容?如果它确实包含其他定义的常量,那就很奇怪了。如果它不包含您的配置 - 专注于解决这个问题。
    • 我在read_configuration 中调试了 (pdb),它没有加载其他常量,它使用 Django 默认值。解决这个问题很困难。仅供参考,我使用设置文件的层次结构:common.py 作为基础,然后是 development.py 和 production.py,它们都执行from settings.common import *。这已经工作了几个月。我尝试将 CELERY_ 常量放在 common.py 或 development.py 中,效果相同。我开始怀疑 Celery 加载程序是在设置文件可用之前执行的。
    猜你喜欢
    • 2012-05-27
    • 2018-04-26
    • 2016-03-25
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2021-11-28
    相关资源
    最近更新 更多