Начать работу сельдерея бросает "no attribute" worker_state_db "

Когда я пытаюсь начать работу с сельдереем в приложении Django, выполните следующие действия:

celery -A myApp worker -l info

Я получаю следующую ошибку:

File "/home/alexander/.pyenv/versions/3.5.1/envs/myApp/lib/python3.5/site-packages/celery/utils/collections.py", line 134, in __getattr__
    type(self).__name__, k))

    AttributeError: 'Settings' object has no attribute 'worker_state_db'

Если вы знаете, как его решить, напишите вашу идею!

Ответ 1

Ошибка возникает при возникновении исключения при настройке синтаксического анализа. Например, когда мы устанавливаем Django SECRET_KEY (или любую другую настройку) через переменную среды:

SECRET_KEY = os.environ['SECRET_KEY']

Чтобы решить проблему, вы можете вернуться к:

SECRET_KEY = "asdfasdfasdf"

или используйте:

SECRET_KEY = os.environ.get('SECRET_KEY', '')

Вы также можете найти, какой параметр вызвал проблему, если вы прокомментируете нашу следующую строку в файле celery.py и снова запустите рабочего:

app.config_from_object('django.conf:settings', namespace='CELERY')

Ответ 2

Я хотел бы добавить две вещи:

  1. Это также верно, когда вы загружаете настройки из любого файла конфигурации, а не Django. Вопрос связан исключительно с сельдереем.

  2. Некоторое объяснение происхождения этой загадочной ошибки:

worker_state_db - это параметр со значением по умолчанию, поэтому вам не нужно устанавливать его вручную. Возникает исключение, потому что Settings просто пусты и не имеют никаких значений, даже значений по умолчанию. Тем не менее, у нас нет загруженной конфигурации по умолчанию. Каким-то образом в Celery исключение из синтаксического анализа (первоначальное, вызвавшее проблему) не распространяется на stderr при запуске работника. Следовательно, вы получаете сообщение, в котором ничего не говорится о возможном решении.

Как это исправить? Например, если у вас есть celeryconfig.py где находится ваш модуль приложения celeryconfig.py и вы загружаете настройки оттуда через:

app.config_from_object('path.to.your.celery.module.celeryconfig')

Проверьте весь файл celeryconfig.py на celeryconfig.py, которые могут привести к сбою синтаксического анализатора (несовместимые значения настроек?).

Ответ 3

У меня та же проблема, но мой Celery контролируется Supervisord.

Я перепробовал все твои советы, и у меня ничего не получалось. Проблема выглядит так, как будто Celery в приложении Django нужны переменные django settings.py, потому что если я сделаю SECRET_KEY = os.environ.get(SECRET_KEY, ''), когда супервизор запустит Celery с командой my_env_path/bin/celery -A myapp worker --loglevel=INFO, мои журналы показывают, что мой секретный ключ не может быть пустым (поэтому мои переменные окружения не устанавливаются при запуске сельдерея, и он падает).

Решение, которое работает для меня, состоит в том, чтобы изменить команду супервизора для запуска сельдерея из:

command=/myenvpath/bin/celery -A myapp worker

чтобы:

command=/bin/bash -c 'source/myenvpath/bin/postactivate &&/myenvpath/bin/celery -A myapp worker

postactivate - это скрипт virtualenv, в котором установлены переменные среды

Как вы думаете, есть проблема безопасности с использованием этого решения?

Спасибо !

Ответ 4

Я получал это снова и снова, пытаясь настроить сельдерей с помощью докернизированного проекта django. Решение включало env_file в docker-compose.yaml:

  celery:
    ...
    env_file: .env