我对此进行了很多研究并尝试了很多不同的方法。然而,金字塔是如此灵活,而且.ini
配置解析器为您所做的事情是如此之少,以至于似乎没有事实上的答案。
在我的场景中,我尝试有一个production.example.ini
最初在版本控制中,它被复制到生产服务器上,并填写了详细信息,但这变得很麻烦,因为对示例的更新没有转换为副本,因此必须随时重新创建副本做出了改变。另外,我开始使用 Heroku,因此不在版本控制中的文件从未进入部署。
然后是加密配置方法。我不喜欢这个范式。想象一下,系统管理员负责维护生产环境,但他或她无法更改数据库的位置或特定于环境的设置,而不通过版本控制将其运行回来。环境和代码之间尽可能分离真是太好了,这样这些更改就可以即时进行,而无需版本控制修订。
我的最终解决方案是拥有一些如下所示的值:
[app:main]
sqlalchemy.url = ${SQLALCHEMY_URL}
然后,在生产服务器上,我将设置环境变量SQLALCHEMY_URL
指向数据库。这甚至允许我使用相同的配置文件进行暂存和生产,这很好。
在我的金字塔初始化中,我只是使用扩展了环境变量值os.path.expandvars http://docs.python.org/2/library/os.path.html#os.path.expandvars:
sqlalchemy_url = os.path.expandvars(settings.get('sqlalchemy.url'))
engine = create_engine(sqlalchemy_url)
而且,如果您想喜欢它并自动替换设置字典中的所有环境变量,我为我的项目制作了这个小帮助方法:
def expandvars_dict(settings):
"""Expands all environment variables in a settings dictionary."""
return dict((key, os.path.expandvars(value)) for
key, value in settings.iteritems())
在你的中像这样使用它main
应用程序入口点:
settings = expandvars_dict(settings)