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

mic*_*slm 14 python version-control configuration-files pyramid

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

在金字塔中,从一个额外的外部文件中获取此设置的规范方法是什么?

编辑 除了使用环境变量的解决方案之外,我在询问#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,)
Run Code Online (Sandbox Code Playgroud)

Ala*_*mas 25

我对此进行了很多调查,并采用了许多不同的方法.但是,Pyramid是如此灵活,.ini配置解析器对你来说是如此之小,以至于似乎没有事实上的答案.

在我的场景中,我尝试production.example.ini在版本控制中首先将其复制到生产服务器上并填写了详细信息,但这很麻烦,因为示例的更新未转换为副本,因此副本具有在任何时候进行更改时都要重新创建.此外,我开始使用Heroku,因此没有版本控制的文件从未进入部署.

然后,有加密的配置方法.其中,我不喜欢范式.想象一下,系统管理员负责维护生产环境,但是他或她无法在不通过版本控制运行的情况下更改数据库或特定于环境的设置的位置.尽可能将环境和代码分开是非常好的,这样可以在没有版本控制修订的情况下即时进行这些更改.

我的最终解决方案是使某些值看起来像这样:

[app:main]

sqlalchemy.url = ${SQLALCHEMY_URL}
Run Code Online (Sandbox Code Playgroud)

然后,在生产服务器上,我将环境变量设置SQLALCHEMY_URL为指向数据库.这甚至允许我使用相同的配置文件进行分段和生产,这很好.

在我的Pyramid init中,我只是使用os.path.expandvars以下方法扩展了环境变量值:

sqlalchemy_url = os.path.expandvars(settings.get('sqlalchemy.url'))
engine = create_engine(sqlalchemy_url)
Run Code Online (Sandbox Code Playgroud)

并且,如果您想要使用它并自动替换设置字典中的所有环境变量,我为我的项目制作了这个小帮助方法:

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())
Run Code Online (Sandbox Code Playgroud)

在您的main应用入口点中使用它:

settings = expandvars_dict(settings)
Run Code Online (Sandbox Code Playgroud)

  • 奇迹般有效!有一点是在python3中没有iteritems(),你应该使用settings.items(). (2认同)