Начать работу сельдерея бросает "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
Я хотел бы добавить две вещи:
-
Это также верно, когда вы загружаете настройки из любого файла конфигурации, а не Django. Вопрос связан исключительно с сельдереем.
-
Некоторое объяснение происхождения этой загадочной ошибки:
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