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").- ПРЕДУПРЕЖДЕНИЕ: Если переменная окружения была изменена, те экземпляры, которые используют фиксированное значение по умолчанию, не будут обновлены, поэтому необходимо помнить о необходимости всегда обновлять установленное значение по умолчанию.