Django 从未想出如何处理配置的标准方法。 Django 默认将其放入项目目录的 settings.py
中,这不太实用,因为您不想覆盖 /usr/lib/python3/{site, dist}-packages/someproject/
来配置你的项目。此外,该文件将在软件包升级后消失。
我想以至少与 sdist、bdist wheel 和 bdist deb 在 linux 上一起工作的方式打包一个 django 项目,并包含/创建来自 /usr/lib/python3/{site,dist} 的符号链接(symbolic link)-packages/someproject/settings.py
到 /etc/someproject/settings.py
。这似乎是一项不可能完成的壮举。
另一种方法是执行 /etc/
中的设置,感觉有点脏。
最佳答案
考虑通过将 Django 配置放在环境变量中来避免此问题,并在 settings.py
中使用合理的默认值。在阅读 The Twelve-Factor App 后,我们的团队已改用此技术。 .
Env vars are easy to change between deploys without changing any code; unlike config files, there is little chance of them being checked into the code repo accidentally; and unlike custom config files, or other config mechanisms such as Java System Properties, they are a language- and OS-agnostic standard.
以下是我们的 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,因为您可以包含评论。
关于python - 使用 setuptools 创建符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53317327/