Django Celery сломался после перемещения секретного ключа в переменную окружения
Я работаю над проектом Django, который использует Celery для периодических задач. Для повышения безопасности я переместил SECRET_KEY Django в переменную окружения. Приложение работало нормально, так что Django, конечно, смог найти переменную окружения и установить SECRET_KEY. Но неожиданным побочным эффектом стало то, что все регулярно возникающие Периодические Задачи перестали срабатывать. Я смог запустить задачи вручную из Django Admin, так что рабочие Celery были все еще живы и здоровы, но задачи не срабатывали сами по себе, как они обычно делают.
Настройки приложения и конфиг Celery находятся в директории под названием server
. Вот структура файлов:
-server
-__init__.py
-celery.py
-settings.py
Перед перемещением секретного ключа он находился в settings.py
вот так: SECRET_KEY = "secret"
После перехода к переменной окружения строка в settings.py
выглядела следующим образом: SECRET_KEY = os.environ.get("SECRET_KEY")
А вот содержание celery.py
, если это имеет значение:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings")
app = Celery("server")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
Как только я переместил секретный ключ из переменной окружения обратно в settings.py
, задачи снова начали выполняться. Я надеюсь выяснить, почему перемещение секретного ключа нарушило периодические задачи, чтобы я мог переместить секретный ключ обратно в переменную окружения без побочных эффектов. Спасибо.
Глядя на список конфигураций Celery, настройки SECRET_KEY
или CELERY_SECRET_KEY
или чего-либо подобного не существует, поэтому проблема может быть не в Celery. Такая настройка специфична для Django, поэтому я предполагаю, что проблема возникает, когда Celery инициализирует приложение Django из настроек Django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings")
.
Предполагая, что переменная окружения SECRET_KEY
не установлена, ее значение будет равно null, что эквивалентно SECRET_KEY = None
. Я попробовал это, и как рабочий, так и планировщик потерпели неудачу.
$ celery --app=my_proj worker # Start the worker
Traceback (most recent call last):
raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
$
$ celery --app=my_proj beat # Start the scheduler
Traceback (most recent call last):
raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
То, на что вы, возможно, захотите обратить внимание:
- Убедитесь, что переменная окружения
SECRET_KEY
была установлена на всех экземплярах, на которых запущено приложение django./manage.py runserver
(или gunicorn, или что угодно), celery workercelery --app=my_proj worker
и celery schedulercelery --app=my_proj beat
. Возможно, он был установлен только на окружении, в котором запущены приложение Django и celery worker , но не на окружении, в котором запущен планировщик celery . - НЕ ДОПУСТИМО. Попробуйте установить значение по умолчанию для
SECRET_KEY
, напримерSECRET_KEY = os.environ.get("SECRET_KEY", "the-value-of-the-secret-key")
.- ПРЕДУПРЕЖДЕНИЕ: Если переменная окружения была изменена, те экземпляры, которые используют фиксированное значение по умолчанию, не будут обновлены, поэтому необходимо помнить о необходимости всегда обновлять установленное значение по умолчанию.