Django-сельдерей: нет результирующего бэкэнда

Я пытаюсь использовать django-сельдерей в своем проекте

В 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 (с теми же настройками сельдерея), он работает отлично. Кто-нибудь сталкивался с этой проблемой раньше?

Спасибо заранее!

Ответ 1

У меня была такая же проблема, когда результат возвращался из задачи сельдерея, хотя была выполнена задача сельдерея (консольные журналы). То, что я нашел, у меня была такая же настройка CELERY_RESULT_BACKEND = "redis" в настройках django.py, но я также создал экземпляр сельдерея в task.py

celery = Celery('tasks', broker='redis://localhost') - который, я полагаю, переопределяет свойство settings.py и, следовательно, он не настраивает серверный сервер для моего экземпляра celery, который используется для хранения результатов.

я удалил это и давал django получить свойства сельдерея, чтобы получить свойства из settings.py, и образец кода работал у меня.

Ответ 3

Для тех, кто находится в отчаянном поиске решения, подобного мне.

Поместите эту строку в конец settings.py script:

djcelery.setup_loader()

Похоже, django-celery не будет учитывать его собственные настройки без строжайшего порядка.

Ответ 4

Как настроить консоль на настройку django, чтобы получить настройки. Например, в PyCharm вы можете запустить консоль django, в которой все работает так, как ожидалось.

Ответ 5

Смотрите AMQP BACKEND SETTINGS для лучшего понимания

Примечание. Бэкэнд AMQP требует RabbitMQ 1.1.0 или выше для автоматически истекает результаты. Если вы используете более старую версию RabbitMQ вы должны отключить истечение результата следующим образом: CELERY_TASK_RESULT_EXPIRES = None

Попробуйте добавить строку ниже к вашим settings.py:

CELERY_TASK_RESULT_EXPIRES = 18000 # 5 hours

Ответ 6

В моем случае проблема заключалась в том, что я передавал аргумент CELERY_RESULT_BACKEND конструктору сельдерея:

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

Решение заключалось в том, чтобы вместо этого использовать аргумент backend:

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