settings.py
中,这不是很可行,因为您不想覆盖/usr/lib/python3/{site,dist}-packages/someproject/
中的文件来配置您的项目。此外,该文件将在软件包升级后消失。
我想打包一个django项目,它至少可以在linux上使用sdist、bdist-wheel和bdist-deb,并包括/创建从/usr/lib/python3/{site,dist}-packages/someproject/settings.py
到/etc/someproject/settings.py
的符号链接。这似乎是一个不可能的壮举。
另一种选择是执行/etc/
中的设置,这感觉有点脏。
考虑通过将Django配置放在环境变量中来避免这个问题,在settings.py
中使用合理的默认值。我们的团队在阅读了The Twelve Factor应用程序后,已经转向了这种技术。
Env变量可以在部署之间轻松更改,而无需更改任何代码;与配置文件不同,它们被意外检入代码回购的可能性很小;与自定义配置文件或其他配置机制(如Java系统属性(不同,它们是一种与语言和操作系统无关的标准。
以下是我们的settings.py
中的几个示例,它们从合理的默认值开始,然后读取环境变量以检查覆盖。
EMAIL_HOST = os.environ.get("MYAPP_EMAIL_HOST", "localhost")
# This is a list of lists in JSON, for example:
# export MYAPP_ADMINS='[["Your Name", "your_email@example.com"]]'
ADMINS = json.loads(os.environ.get("MYAPP_ADMINS", "[]"))
在选择默认值时,考虑让新开发人员更容易地设置项目,以及在默认情况下确保项目的安全。
您可以看到,EMAIL_HOST
示例是一个简单的字符串,而ADMINS
示例从JSON字符串加载更多的结构。更复杂的设置,如LOGGING
,可能难以从环境变量加载。从环境变量(如日志记录级别(加载设置的小部分,或者使用环境变量将路径传递到JSON、YAML或INI文件。就我个人而言,我更喜欢YAML而不是JSON,因为您可以包含注释。