【问题标题】:Create a symlink with setuptools使用 setuptools 创建符号链接
【发布时间】:2019-04-18 10:19:36
【问题描述】:

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/ 中的设置,感觉有点脏。

【问题讨论】:

  • 由于符号链接将在/etc/... 中创建,这意味着需要以root 进行安装。对吗?
  • 没有链接会指向 /etc/。因此不需要root。
  • 我不会去那里。记录您的项目可能尝试从中加载配置的标准位置,允许将您的项目配置为使用命令行开关、环境变量或从导入项目的 Python 代码查看其他位置,就是这样。请勿在标准 setuptools 位置之外更改系统,因为并非所有安装都会遵循您在此处设想的模式。
  • 例如,/etc/someproject 要求项目在系统范围内安装。当您强制该位置时,使用该项目的人无法决定划分设置并运行多个副本。
  • 我有点同意要求配置在 /etc/someproject/ 中并不是很好,尽管我认为对于某些项目来说这是一个不错的折衷。

标签: python django configuration setuptools configuration-management


【解决方案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,因为您可以包含 cmets。

【讨论】:

  • 这种方法很有意义,我们已经为我们的许多项目这样做了。 python/django 的问题是,很多东西都需要复杂的 python 对象来配置。最好的例子是日志库中 python 可怕构建的 dictConfig。我们软件的用户可能希望部分更改我们的默认配置以添加他们的应用程序、添加处理程序等。环境变量只是不要在这里删除它。 docs.python.org/3/howto/…
  • 我为更复杂的设置添加了一些建议,@Bernd。
猜你喜欢
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多