如何使用 Dynaconf 配置 Celery

How to use Dynaconf to configure Celery

最近我发现了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 对象。您可以导入该对象或让 Celery 通过使用 'acme_project.config:settings' 作为您传递给 app.config_from_object() 的值来执行此操作。 namespace 参数告诉 Celery 期望所有设置都以 CELERY_ 为前缀,就像它在 Django 中的工作方式一样。如果您计划使用 Dynaconf 管理的设置来配置多个组件,而不仅仅是 Celery,请使用它。

例如,如果您使用:

app.config_from_object('acme_project.config:settings', namespace='CELERY')

那么您的 settings.tomlsettings.yaml 或您选择的任何文件格式都需要使用 CELERY_ 作为所有设置的前缀。

如果您正在使用 Django plugin for Dynaconf 那么您可以直接使用 django.conf:settings 作为 Dynaconf 修补 django 设置对象。

如果您仍然遇到问题,我建议您在 dynaconf repo 上提出问题并尝试直接使用您的应用程序的设置。

例如,如果您有一个名为 foo 的应用程序,您的 DJANGO_SETTINGS_MODULE 可能是 foo.settings 那么您可以使用芹菜:

app.config_from_object('foo.settings:settings')