2012-07-23 54 views
7

django文檔明確指出爲什麼不應該在運行時更改django設置?

您不應在運行時更改應用程序中的設置。

這裏的link to that statement

我的問題是,爲什麼會這樣?我想在運行時動態添加應用程序,並在運行時添加數據庫,這兩者都涉及編輯設置。有人可以解釋爲什麼不會在運行時編輯設置,並且如果存在例外,它們是哪些設置以及它們爲何例外?我對如何實現我的目標沒有那麼感興趣,但是爲什麼設置不應該改變。

+0

我看了一下https://docs.djangoproject.com/en/dev/ref/settings/,在我看來這些都是應用程序啓動時的所有設置。*因此,它不會在運行時修改它們很有意義。 – 2012-07-23 23:19:01

回答

5

如果您在運行時更改大多數設置,則不會重新讀取它們。所以Django不會承認你所做的改變。

這是因爲Django只是普通的Python代碼。它不像一個監視你的代碼的服務器 - 它只是你的代碼的一部分。

在某些情況下,Django代碼的某些部分可能會響應設置中的更改,例如,每次發送郵件時它們都會執行'settings.DEFAULT_FROM_EMAIL'。

但是,如果Django以任何方式處理設置,就像它必須爲INSTALLED_APPS所做的那樣,它不會注意到您改變了某些內容並重新執行處理。

哪些設置是安全的?那麼,這些文件是說「沒有人是安全的」,因爲它可能會在未來發生變化。由於某種原因,Django可能會保存任何設置的副本,或者進行一些處理。

更改INSTALLED_APPS永遠無法工作,因爲它會改變導入的模塊。 Django根本無法像Python那樣在這個層面上工作 - 它需要能夠'unimport'模塊,這基本上是不可能的(唯一的方法就是重啓進程),還有其他的與跨應用程序鏈接相關的問題。

1

AFAIK沒有關於哪些設置在運行時可以安全修改的文檔,但有一個open ticket要求將它們記錄得更清楚。

+0

自己的設置變量如何?例如在設置中創建一個空字典,並在系統運行期間向其添加數據(在這種情況下,如果數據在系統重新啓動時丟失,則無關)。 – Derek 2017-03-27 06:45:56

1

如果你在設置對象中使用look under the hood Django公開接口與你的項目的設置模塊,你會注意到沒有什麼能夠阻止你在運行時動態改變設置。

但是,您應該意識到,框架的架構是圍繞請求 - 響應流而建立的,其中大量全局狀態在線程之間共享以進行內存優化,前提是應用程序在初始化期間僅配置一次。

相關問題