【问题标题】:Why shouldn't django settings be altered at runtime?为什么不应该在运行时更改 django 设置?
【发布时间】:2012-07-22 05:48:33
【问题描述】:

django 文档明确说明

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

这是link to that statement

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

【问题讨论】:

标签: django runtime settings edit


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 自己的设置变量怎么样?例如在设置中创建一个空字典,并在系统运行期间向其中添加数据(在这种情况下,如果数据在系统重启时丢失,则无关紧要)。
    【解决方案3】:

    如果您在 Django 公开的设置对象上使用 look under the hood 以与项目的设置模块进行交互,您会注意到没有什么可以阻止您在运行时动态更改设置。

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

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 2015-07-11
      • 2019-02-26
      • 2010-10-10
      • 1970-01-01
      • 2018-11-04
      相关资源
      最近更新 更多