9

django 文档明确指出

您不应在运行时更改应用程序中的设置。

这是该声明的链接

我的问题是,为什么会这样?我想在运行时动态添加应用程序,并在运行时添加数据库,这两者都涉及编辑设置。有人可以解释为什么在运行时不编辑设置,如果存在异常,它们是哪些设置以及为什么它们是异常的?我对如何实现我的目标不是很感兴趣,而是对不应该更改设置的原因感兴趣。

4

3 回答 3

7

如果您在运行时更改它们,大多数设置将不会被重新读取。因此 Django 将无法识别您所做的更改。

这是因为 Django 只是普通的 Python 代码。它不像监控您的代码的服务器 - 它只是您的代码的一部分。

在某些情况下,部分 Django 代码可能会响应设置的更改,因为它们可能会在每次发送邮件时执行“settings.DEFAULT_FROM_EMAIL”,例如。

但是,如果 Django 以任何方式处理设置,就像它必须为 INSTALLED_APPS 所做的那样,它不会注意到您更改了某些内容并重新进行处理。

哪些设置是安全的?好吧,文档说“没有一个是安全的”,因为它将来可能会改变。Django 可能会出于某种原因保存任何设置的副本,或者进行一些处理。

更改 INSTALLED_APPS 永远不会起作用,因为它会改变导入的模块。Django 根本无法绕过 Python 在这个级别的工作方式——它需要能够“取消导入”模块,这基本上是不可能的(唯一的方法是重新启动进程),还有其他与跨应用链接相关的问题。

于 2012-07-23T23:30:39.947 回答
1

如果您深入了解Django 公开以与项目的设置模块接口的设置对象,您会注意到没有什么可以阻止您在运行时动态更改设置。

但是,您应该意识到,该框架的架构是围绕请求-响应流构建的,其中许多全局状态在线程之间共享以进行内存优化,前提是应用程序在初始化期间仅配置一次。

于 2012-07-24T14:08:49.703 回答
1

AFAIK 没有关于在运行时可以安全修改哪些设置的文档,但是有一张公开票要求更清楚地记录它们。

于 2012-07-24T00:28:08.537 回答