【问题标题】:Django Celery broken after moving secret key to environment variable将密钥移动到环境变量后,Django Celery 损坏
【发布时间】:2021-11-02 02:43:19
【问题描述】:

我正在开发一个使用 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,任务就会再次启动。我希望弄清楚为什么移动密钥会破坏定期任务,这样我就可以将密钥移回环境变量而不会产生副作用。谢谢。

【问题讨论】:

    标签: django environment-variables celery django-celery


    【解决方案1】:

    查看Celery configurations的列表,SECRET_KEYCELERY_SECRET_KEY或任何类似的设置都不存在,所以问题可能不在Celery内部。这样的设置是特定于 Django 的,所以我认为问题出在 Celery 从 Django 设置 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings") 初始化 Django 应用程序时。

    假设环境变量SECRET_KEY没有设置,它的值为null,相当于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 和 celery 调度程序 celery --app=my_proj beat 的所有实例上设置了环境变量 SECRET_KEY。也许它只设置在运行 Django 应用程序和 celery worker 的环境上,而不是运行 celery 调度程序的环境上
    2. 不建议。 尝试为SECRET_KEY 设置一个默认值,例如SECRET_KEY = os.environ.get("SECRET_KEY", "the-value-of-the-secret-key")
      • 警告:如果更改了环境变量,那些使用固定默认值的实例将不会被更新,因此您必须记住始终更新设置的默认值。

    【讨论】:

    • 谢谢@Niel! Celery beat 正在一个单独的环境中运行,该环境无权访问环境变量。
    猜你喜欢
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2020-03-24
    • 2020-09-16
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多