将密钥移动到环境变量后,Django Celery 坏了

Django Celery broken after moving secret key to environment variable

我正在开发一个使用 Celery 执行周期性任务的 Django 项目。为了提高安全性,我将 Django 的 SECRET_KEY 移到了一个环境变量中。应用 运行 很好,所以 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 configurations 的列表,设置 SECRET_KEYCELERY_SECRET_KEY 或类似的设置不存在,因此问题可能不在 Celery 中。这种设置是特定于 Django 的,所以我认为问题出在 Celery 从 Django 设置 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings").

初始化 Django 应用程序时

假设没有设置环境变量SECRET_KEY,它的值为空,相当于SECRET_KEY = None。我试过了,worker 和 scheduler 都失败了。

$ 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. 确保在运行 django 应用程序 ./manage.py runserver(或 gunicorn,或其他)、celery worker celery --app=my_proj worker 的所有实例上设置了环境变量 SECRET_KEY,以及芹菜调度程序 celery --app=my_proj beat。也许它只在运行 Django 应用程序和 celery worker 的环境中设置 而不是在运行 celery scheduler.
  2. 的环境中
  3. 不建议。 尝试为 SECRET_KEY 设置默认值,例如 SECRET_KEY = os.environ.get("SECRET_KEY", "the-value-of-the-secret-key")
    • 警告:如果更改了环境变量,那些使用固定默认值的实例将不会更新,因此您必须记住也要始终更新设置的默认值值。