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.

То, на что вы, возможно, захотите обратить внимание:

  1. Убедитесь, что переменная окружения SECRET_KEY была установлена на всех экземплярах, на которых запущено приложение django ./manage.py runserver (или gunicorn, или что угодно), celery worker celery --app=my_proj worker и celery scheduler celery --app=my_proj beat. Возможно, он был установлен только на окружении, в котором запущены приложение Django и celery worker , но не на окружении, в котором запущен планировщик celery .
  2. НЕ ДОПУСТИМО. Попробуйте установить значение по умолчанию для SECRET_KEY, например SECRET_KEY = os.environ.get("SECRET_KEY", "the-value-of-the-secret-key").
    • ПРЕДУПРЕЖДЕНИЕ: Если переменная окружения была изменена, те экземпляры, которые используют фиксированное значение по умолчанию, не будут обновлены, поэтому необходимо помнить о необходимости всегда обновлять установленное значение по умолчанию.
Вернуться на верх