django-celery:没有配置后端结果

时间:2011-12-08 06:54:11

标签: django django-celery

我正在尝试在我的项目中使用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(使用相同的芹菜设置)时,它的效果很好。有没有人遇到过这个问题?

提前致谢!

6 个答案:

答案 0 :(得分:5)

虽然芹菜任务已执行(控制台日志),但从celery任务获取结果时遇到了同样的问题。我发现的是,我在django settings.py中有相同的设置CELERY_RESULT_BACKEND = "redis",但我还在tasks.py中实例化了芹菜。

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

我删除了这个,让django从settings.py获取芹菜获取属性,示例代码为我工作。

答案 1 :(得分:2)

对于那些急需寻找像我一样的解决方案的人。

将此行放在settings.py脚本的末尾:

djcelery.setup_loader()

如果没有严格的订单, django-celery 似乎不会考虑它自己的设置。

答案 2 :(得分:1)

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

%python manage.py shell

答案 3 :(得分:0)

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

答案 4 :(得分:0)

有关更好的理解,请参阅AMQP BACKEND SETTINGS

  

注意AMQP后端需要RabbitMQ 1.1.0或更高版本   自动过期结果。如果您运行的是旧版本   RabbitMQ你应该禁用结果过期,如下所示:   CELERY_TASK_RESULT_EXPIRES = None

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

CELERY_TASK_RESULT_EXPIRES = 18000 # 5 hours

答案 5 :(得分:0)

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

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'])