擅长:python、mysql、java
<p>我对此进行了很多研究,并采用了很多不同的方法。然而,Pyramid非常灵活,<code>.ini</code>config解析器对您的作用非常小,似乎没有实际的答案。在</p>
<p>在我的场景中,我首先尝试在版本控制中使用<code>production.example.ini</code>在生产服务器上复制,并填写详细信息,但这变得很麻烦,因为对示例的更新没有转换为副本,因此在进行更改时必须重新创建副本。另外,我开始使用Heroku,因此不在版本控制中的文件从未进入部署中。在</p>
<p>然后是加密配置方法。我不喜欢这种模式。假设一个系统管理员负责维护生产环境,但他或她无法更改数据库或特定于环境的设置的位置,而不通过版本控制运行它。在环境和代码之间尽可能地分离是非常好的,这样就可以在没有版本控制修改的情况下动态地进行这些更改。在</p>
<p>我的最终解决方案是获得如下所示的一些值:</p>
<pre><code>[app:main]
sqlalchemy.url = ${SQLALCHEMY_URL}
</code></pre>
<p>然后,在生产服务器上,将环境变量<code>SQLALCHEMY_URL</code>设置为指向数据库。这甚至允许我对登台和生产使用相同的配置文件,这很好。在</p>
<p>在Pyramid init中,我只是使用<a href="http://docs.python.org/2/library/os.path.html#os.path.expandvars">^{<cd4>}</a>扩展了环境变量值:</p>
^{pr2}$
<p>而且,如果您想使用它并自动替换设置字典中的所有环境变量,我为我的项目创建了一个小助手方法:</p>
<pre><code>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())
</code></pre>
<p>在您的<code>main</code>应用程序入口点中如下所示:</p>
<pre><code>settings = expandvars_dict(settings)
</code></pre>