为什么不应该在运行时更改django设置?

时间:2012-07-23 23:15:29

标签: django runtime settings edit

django文档明确指出

  

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

这是link to that statement

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

3 个答案:

答案 0 :(得分:6)

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

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

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

但是如果Django以任何方式处理设置,就像它必须为INSTALLED_APPS做的那样,它不会注意到你改变了一些东西并重新进行处理。

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

改变INSTALLED_APPS永远不会起作用,因为它会改变导入的模块。 Django根本没有办法解决Python在这个级别上的工作方式 - 它需要能够'unmport'模块,这基本上是不可能的(唯一的方法是重启过程),还有其他的与跨应用程序链接相关的问题。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果您在设置对象上使用look under the hood,Django会暴露于与项目设置模块的接口,您会发现没有什么可以阻止您在运行时动态更改设置。

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