如何在Celery中使用config_from_envvar



我正在尝试使用外部文件配置Celery,以将配置与代码分离。Celery和Flask都有config.from_envvar() / config_from_envvar()方法,只是它们的行为有点不同,而我所做的仅适用于Flask。

烧瓶

基本上,在Flask,我做

app.config.from_object(config_class)
app.config.from_envvar('SETTINGS_FILE', silent=True)

它加载存储在应用程序代码中的默认配置,然后加载存储在文件系统中任何位置的设置文件,其中一些自定义设置覆盖默认文件中的设置。我只需要编写该文件并通过环境变量传递其路径。

(在Flask文档或这个答案中有更多关于这一点的内容。我发现Flask将该文件视为Python文件有点模棱两可,而该示例使用settings.cfg(没有.py扩展名),但它运行良好)。

芹菜

当对Celery做同样的事情时,我得到了这个错误:

ImportError: No module named '/absolute/path/to/settings'

我将文件命名为settings.py(扩展名为.py,以备不时之需)。

我不知道该把那个文件放在哪里。我看到的例子,例如在回答这个问题时,将配置文件放在代码中,这正是我想要避免的。

因为您既不想操作PYTHONPATH,也不想将配置文件放在应用程序目录下,所以剩下的唯一选项是从文件路径加载配置:

def load_config_from_file(celery_app, filepath):
conf = {}
with open(filepath) as fp:
exec(compile(fp.read(), filepath, 'exec'), {}, d)
celery_app.config_from_object(conf)

顺便说一句,据我所知,大多数(如果不是全部的话)芹菜配置选项名称与烧瓶的名称没有冲突,你可以将它们一起写入一个文件,让烧瓶加载,然后芹菜就可以从烧瓶中读取配置:

celery_app.conf.update(flask_app.config)

相关内容

  • 没有找到相关文章

最新更新