Django和Deployment中的私有设置

Fal*_*ter 9 python security deployment django fabric

我正在使用Django并使用Ansible部署我的堆栈.最后,我使用Fabric来部署我的Django项目,从GitHub中提取我的代码.

我的问题:在Django的settings.py文件中处理私人设置的最佳做法是什么,例如电子邮件或S3的密码?目前,我在部署脚本结束时将settings_production.py从我的机器文件传输到生产机器,然后重新启动应用程序服务器.此文件包含我没有将settings.py作为repo的一部分放入的设置.

在我的settings.py结束时,我正在添加类似的内容

try:
    from settings_production import *
except ImportError:
    pass
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?

oro*_*aki 7

答案是:http://12factor.net/config.

您应该通过不同的设置模块管理环境之间的代码相关差异.这方面的一个例子是debug_toolbar在INSTALLED_APPS本地添加,同时在生产中删除它.要处理这个方面,您应该将所有设置模块保留在版本控制中,而不是使用旧的try: import except ImportError: ...习惯用法并保留local_settings.py本地计算机上的版本控制,包括本地设置.然后,在wsgi.py和中manage.py,使用os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.conf.local')默认项目以使用本地设置.在开发/生产中,添加环境变量以使用相应的设置模块(例如,DJANGO_SETTINGS_MODULE=myproject.conf.dev).

当您使用12 Factor时,不再需要将某些设置模块保留在版本控制之外,因为使用12 Factor,您不会将任何密码或敏感设置直接放入设置模块中.你改为将它们保存在环境中并像这样访问它们:

# Inside of a settings module
FOO_PASSWORD = os.environ['FOO_PASSWORD']
Run Code Online (Sandbox Code Playgroud)

在像Heroku这样的环境中,这种设置很简单,因为您可以通过Web界面为您的应用程序输入配置变量.

我推荐几乎所有12 Factor的原则,特别是可处置性,日志和配置等.

合理的牺牲

如果您想维护一个额外的设置模块,不受版本控制,以避免在本地开发期间使用环境变量(我不怪你),你仍然可以遵循上述原则并添加到底部本地设置模块的是在版本控制,try: from some_other_local import * except: pass.这将允许你在本地设置只需要覆盖设置,同时仍保持的本地设置的版本控制(如本地数据库,相对静态/媒体文件的路径,安装的应用程序等),剩下的,它给你最好的这两个世界.

额外资源