我希望将development.ini
和production.ini
置于版本控制之下,但出于安全原因,我不希望存储{
在金字塔中,从额外的外部文件获取此设置的标准方式是什么?在
编辑 除了使用环境变量的解决方案外,我在询问#pyramid时提出了这个解决方案:
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
# Read db password from config file outside of version control
secret_cfg = ConfigParser()
secret_cfg.read(settings['secrets'])
dbpass = secret_cfg.get("secrets", "dbpass")
settings['sqlalchemy.url'] = settings['connstr'] % (dbpass,)
金字塔中独立的ini文件的全部意义在于,您不必对它们进行版本控制,并且它们可以包含针对不同场景(开发/生产/测试)的不同设置。你的生产.ini几乎总是不应该与源代码在同一个VCS中。在
我对此进行了很多研究,并采用了很多不同的方法。然而,Pyramid非常灵活,
.ini
config解析器对您的作用非常小,似乎没有实际的答案。在在我的场景中,我首先尝试在版本控制中使用
production.example.ini
在生产服务器上复制,并填写详细信息,但这变得很麻烦,因为对示例的更新没有转换为副本,因此在进行更改时必须重新创建副本。另外,我开始使用Heroku,因此不在版本控制中的文件从未进入部署中。在然后是加密配置方法。我不喜欢这种模式。假设一个系统管理员负责维护生产环境,但他或她无法更改数据库或特定于环境的设置的位置,而不通过版本控制运行它。在环境和代码之间尽可能地分离是非常好的,这样就可以在没有版本控制修改的情况下动态地进行这些更改。在
我的最终解决方案是获得如下所示的一些值:
然后,在生产服务器上,将环境变量
SQLALCHEMY_URL
设置为指向数据库。这甚至允许我对登台和生产使用相同的配置文件,这很好。在在Pyramid init中,我只是使用^{} 扩展了环境变量值:
^{pr2}$而且,如果您想使用它并自动替换设置字典中的所有环境变量,我为我的项目创建了一个小助手方法:
在您的
main
应用程序入口点中如下所示:我发现这种方法可以从额外的配置和env中加载机密。在
上面的代码将从配置键
drawstack.secrets
的值加载任何变量,然后尝试从环境加载DB_URL
。在drawstack.secrets
可以是相对于原始配置文件的,也可以是绝对的。在相关问题 更多 >
编程相关推荐