代码之家  ›  专栏  ›  技术社区  ›  iancoleman

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

  •  9
  • iancoleman  · 技术社区  · 13 年前

    django文件明确指出

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

    这是 link to that statement

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

    3 回复  |  直到 13 年前
        1
  •  8
  •   spookylukey    13 年前

    如果在运行时更改大多数设置,则不会重新读取这些设置。所以Django不会意识到你所做的改变。

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

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

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

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

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

        2
  •  1
  •   Vinod Kurup    13 年前

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

        3
  •  1
  •   Filip Dupanović    13 年前

    如果你采取 look under the hood 在Django向项目的设置模块接口公开的设置对象中,您会注意到没有什么可以阻止您在运行时动态更改设置。

    然而,您应该意识到,该框架的体系结构是围绕请求-响应流构建的,在该流中,基于应用程序在初始化期间仅配置一次的前提,线程之间共享了大量全局状态以进行内存优化。