一千萬個為什麽

搜索

在運行時更改Django設置

我想將一些(特定於應用程序的)設置暴露給管理界面,這樣用戶可以輕松地更改它們,也不必重新啟動Django。

我該怎麽辦呢?

我在 http://djangopackages.com/grids/g/live-setting/上查看了應用程序(btw django-constance是最吸引人的)但實際上所有這些應用程序正在做的是將值存儲在數據庫中,提供用於更改它們的Web界面和緩存。 Django中已經內置了前兩個功能嗎?

我看到的最大缺點是沒有一個應用程序是這些設置的舊位置(settings.py)的替代品,並且要求我遷移到他們的表示法,並且經常添加另一個上下文處理器以在模板中訪問它們。

我不能這樣做嗎?

  1. Create a model for my settings (this gives me the various types and validation)
  2. Instantiate one such object to hold my settings (this allows the users to edit them in the admin interface) - I could dump defaults as fixtures like for other models
  3. Wrap settings.py so it makes a database query for my settings - http://www.loose-bits.com/2011/04/extending-django-settings-with-derived.html

從我目前的天真觀點來看,我看到的唯一缺點是:

  1. 添加或更改可用設置需要架構遷移(南)。 - 我可以忍受。
  2. 我有一個可能有多個實例的模型,但實際上只需要一個單例。 - 在某些時候,這實際上可能是一個有用的功能。
  3. 性能/緩存:查看 http://code.djangoproject.com/svn/django/trunk/django/conf/我必須在設置包裝器和/或模型中加入一點聰明,以便模型更改清除或更新緩存值。 - 似乎不是火箭科學。
  4. 在另一個項目中做同樣的事情需要再次進行類似的努力。 - 我認為settings.py中的單個字典常量,包含查找的模型名稱和字段名稱都是不同的。

這不是兩個世界中最好的 - 運行時管理(具有所有特權),數據庫後端,緩存,以及我的所有設置.USED_TO_BE_IN_SETTINGS_DOT_PY將需要任何更改。我錯過了什麽嗎?

最佳答案

AFAIK,Django設置應該是不可變的。這有多種原因,最明顯的是Django不知道服務器的執行模型(prefork/multi-threaded)。

此外,您無法從Django模型加載設置本身,因為需要先加載設置,然後才能在ORM中使用任何內容。

所以,基本上,你有兩個解決方案:

  • 您可以使用任何較低級別的數據庫訪問機制來加載數據庫中的設置;或
  • 您可以在其他模型中定義設置,並在需要時直接獲取它們。

第一個是令人難以置信的黑客,我不建議。第二種更直接,更清潔,但要求你改變你的習慣( from django.conf import settings )。

第二種方法可能是您鏈接到的第三方應用程序實現的方法。

轉載註明原文: 在運行時更改Django設置