django文档明确指出
您不应在运行时更改应用程序中的设置。
我的问题是,为什么会这样?我想在运行时动态添加应用程序,并在运行时添加数据库,这两者都涉及编辑设置。有人可以解释为什么不在运行时编辑设置,如果存在例外,它们是哪些设置以及为什么它们是例外?我对如何实现目标并不感兴趣,但是为什么不应该改变设置的原因。
答案 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会暴露于与项目设置模块的接口,您会发现没有什么可以阻止您在运行时动态更改设置。
但是,您应该理解框架的体系结构是围绕请求 - 响应流构建的,其中许多全局状态在线程之间共享以进行内存优化,这基于应用程序在初始化期间仅配置一次的前提。