在 Pyramid Web 框架中,如何将敏感设置从外部文件导入到development.ini / Production.ini 中?

2024-02-05

我想保留development.ini and production.ini在版本控制下,但出于安全原因不希望sqlalchemy.url要存储的连接字符串,因为这将包含用于数据库连接的用户名和密码。

在 Pyramid 中,从其他外部文件获取此设置的规范方法是什么?

Edit除了使用环境变量的解决方案之外,我在询问 #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配置解析器为您所做的事情是如此之少,以至于似乎没有事实上的答案。

在我的场景中,我尝试有一个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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Pyramid Web 框架中,如何将敏感设置从外部文件导入到development.ini / Production.ini 中? 的相关文章

随机推荐