将密钥移动到环境变量后,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_KEY
或 CELERY_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.
您可能想看的东西:
- 确保在运行 django 应用程序
./manage.py runserver
(或 gunicorn,或其他)、celery worker celery --app=my_proj worker
的所有实例上设置了环境变量 SECRET_KEY
,以及芹菜调度程序 celery --app=my_proj beat
。也许它只在运行 Django 应用程序和 celery worker 的环境中设置 而不是在运行 celery scheduler. 的环境中
- 不建议。 尝试为
SECRET_KEY
设置默认值,例如 SECRET_KEY = os.environ.get("SECRET_KEY", "the-value-of-the-secret-key")
。
- 警告:如果更改了环境变量,那些使用固定默认值的实例将不会更新,因此您必须记住也要始终更新设置的默认值值。
我正在开发一个使用 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_KEY
或 CELERY_SECRET_KEY
或类似的设置不存在,因此问题可能不在 Celery 中。这种设置是特定于 Django 的,所以我认为问题出在 Celery 从 Django 设置 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings")
.
假设没有设置环境变量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.
您可能想看的东西:
- 确保在运行 django 应用程序
./manage.py runserver
(或 gunicorn,或其他)、celery workercelery --app=my_proj worker
的所有实例上设置了环境变量SECRET_KEY
,以及芹菜调度程序celery --app=my_proj beat
。也许它只在运行 Django 应用程序和 celery worker 的环境中设置 而不是在运行 celery scheduler. 的环境中
- 不建议。 尝试为
SECRET_KEY
设置默认值,例如SECRET_KEY = os.environ.get("SECRET_KEY", "the-value-of-the-secret-key")
。- 警告:如果更改了环境变量,那些使用固定默认值的实例将不会更新,因此您必须记住也要始终更新设置的默认值值。