django-celery:未配置结果后端

问题描述 投票:0回答:8

我正在尝试在我的项目中使用 django-celery

在settings.py中我有

CELERY_RESULT_BACKEND = "amqp"

服务器开始正常

python manage.py celeryd --setting=settings

但是如果我想访问延迟任务的结果,则会收到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\celery\result.py", line 108, in ready
    return self.status in self.backend.READY_STATES
  File "C:\Python27\lib\site-packages\celery\result.py", line 196, in status
    return self.state
  File "C:\Python27\lib\site-packages\celery\result.py", line 191, in state
    return self.backend.get_status(self.task_id)
  File "C:\Python27\lib\site-packages\celery\backends\base.py", line 404, in _is
_disabled
    raise NotImplementedError("No result backend configured.  "
NotImplementedError: No result backend configured.  Please see the documentation
 for more information.

这很奇怪,因为当我只运行 celeryd (具有相同的 celery 设置)时,它工作得很好。有人遇到过这个问题吗?

提前致谢!

django django-celery
8个回答
7
投票

尽管执行了 celery 任务(控制台日志),但从 celery 任务返回结果时我遇到了同样的问题。我发现,我在 django settings.py 中具有相同的设置

CELERY_RESULT_BACKEND = "redis"
,但我还在tasks.py中实例化了芹菜

celery = Celery('tasks', broker='redis://localhost')
- 我认为它会覆盖 settings.py 属性,因此它没有为我的用于存储结果的 celery 实例配置后端服务器。

我删除了这个并让 django 从 settings.py 获取 celery 属性,示例代码对我有用。


4
投票

如果您只是运行来自 http://www.celeryproject.org/tutorials/first-steps-with-celery/ 的示例,则需要通过manage.py 运行控制台:

% python 管理.py shell


3
投票

就我而言,问题是我将 CELERY_RESULT_BACKEND 参数传递给 celery 构造函数:

Celery('proj',
         broker = 'amqp://guest:guest@localhost:5672//',
         CELERY_RESULT_BACKEND='amqp://',
         include=['proj.tasks'])

解决方案是改用后端参数:

Celery('proj',
         broker = 'amqp://guest:guest@localhost:5672//',
         backend='amqp://',
         include=['proj.tasks'])

2
投票

对于那些像我一样迫切寻求解决方案的人。

将此行放在

settings.py
脚本的末尾:

djcelery.setup_loader()

看起来 django-celery 不会在没有严格顺序的情况下考虑它自己的设置。


1
投票

对于 2023 年遇到此问题的用户。如果您使用的是 Celery 5.0 或更高版本,请在设置中设置 CELERY_RESULT_BACKEND = "rpc://"。如果您正在初始化 celery 应用程序,请使用以下代码:

Celery('your_project_name',
     broker = 'amqp://guest:guest@localhost:5672//',
     backend='rpc://',
     include=['proj.tasks'])

0
投票

控制台如何设置 django 环境才能获取设置。例如,在 PyCharm 中,您可以运行 django 控制台,其中一切都按预期运行。


0
投票

请参阅AMQP后端设置以更好地理解

注意 AMQP 后端需要 RabbitMQ 1.1.0 或更高版本 结果自动过期。如果您运行的是旧版本 RabbitMQ 您应该像这样禁用结果过期:

CELERY_TASK_RESULT_EXPIRES = None

尝试将以下行添加到您的settings.py中:

CELERY_TASK_RESULT_EXPIRES = 18000 # 5 hours


0
投票

就我而言,这显然是 celery 初始化期间出现的问题。我之前的配置是

if 'APP_ENV' in os.environ and os.environ['APP_ENV'] == 'dev': 
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "master.settings.local")

app = Celery('master', namespace='CELERY')

但是,我更改为以下以使其正常工作

app = Celery('master')

if 'APP_ENV' in os.environ and os.environ['APP_ENV'] == 'dev':
  app.config_from_object("master.settings.local", namespace='CELERY')
 

此外,我的 django 设置现在看起来像这样

CELERY_BROKER_URL = os.getenv('CELERY_BROKER_URL')
CELERY_BAKEND_URL = os.getenv('CELERY_BAKEND_URL')
CELERY_RESULT_BACKEND=os.getenv('CELERY_BAKEND_URL')
CELERY_TIMEZONE = "Australia/Tasmania"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60

注意,我添加了 CELERY_RESULT_BACKEND。希望这会节省别人的时间。

© www.soinside.com 2019 - 2024. All rights reserved.