问题描述
最近我发现了 Dynaconf,这是一个很好的配置管理包,可以很好地与 Flask 和 Django 集成。 Django 应用程序与 Dynaconf 一起运行得非常好。但是,我的应用程序运行后台任务所依赖的 Celery 应用程序不是。
这是在使用 Dynaconf 之前工作的 Celery 应用程序的配置代码:
from celery import Celery
app = Celery('KillerApp')
app.config_from_object('django.conf:settings',namespace='CELERY')
看来我需要将 'django.conf:settings' 更改为其他内容。有什么想法吗?
解决方法
可以传入一个字符串表示要导入的模块,也可以直接传入配置对象;请参阅Celery.config_from_object()
method documentation。
您将拥有一个设置 Dynaconf()
实例的模块,例如如果您有一个名为 acme_project
的包,其中包含一个 config.py
文件,
from dynaconf import Dynaconf
settings = Dynaconf(
settings_files=['settings.toml','.secrets.toml'],)
然后您可以导入 acme_project.config
并在那里找到 settings
对象。您可以导入该对象,也可以使用 'acme_project.config:settings'
作为传递给 app.config_from_object()
的值让 Celery 执行此操作。 namespace
参数告诉 Celery 期望所有设置都以 CELERY_
为前缀,这与 Django 的工作方式完全一样。如果您计划使用 Dynaconf 管理的设置来配置多个组件,而不仅仅是 Celery,请使用此选项。
例如,如果您使用:
app.config_from_object('acme_project.config:settings',namespace='CELERY')
那么您的 settings.toml
或 settings.yaml
或您选择的任何文件格式都需要使用 CELERY_
作为所有设置的前缀。
如果您使用的是 Django plugin for Dynaconf,那么您可以直接使用 django.conf:settings
作为 Dynaconf 补丁 django 设置对象。
如果您仍有问题,我建议您在 dynaconf repo 上打开一个问题并尝试直接使用您的应用程序的设置。
例如,如果您有一个名为 foo
的应用,您的 DJANGO_SETTINGS_MODULE
可能是 foo.settings
,那么您可以将其用于 celery:
app.config_from_object('foo.settings:settings')