使用setuptools创建符号链接

时间:2018-11-15 10:27:39

标签: python django configuration setuptools configuration-management

Django从未想出如何处理配置的标准方法。 Django默认将其放入项目目录中的settings.py中,这不太可行,因为您不想覆盖/usr/lib/python3/{site,dist}-packages/someproject/中的文件来配置项目。软件包升级后,该文件将消失。

我想以至少与Linux上的sdist,bdist wheel和bdist deb兼容的方式打包django项目,并包含/创建从/usr/lib/python3/{site,dist}-packages/someproject/settings.py/etc/someproject/settings.py的符号链接。这似乎是不可能的壮举。

另一种选择是执行/etc/中的设置,感觉有点脏。

1 个答案:

答案 0 :(得分:1)

请考虑将Django配置放入环境变量中,并在settings.py中使用明智的默认值,从而避免出现此问题。我们的团队在阅读The Twelve-Factor App后已改用这项技术。

  

环境变量很容易在部署之间进行更改,而无需更改任何代码;与配置文件不同,它们很少有可能被意外检入代码存储库;与自定义配置文件或其他配置机制(例如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,因为您可以包含注释。

相关问题