我正在尝试使用外部文件配置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)