2010-08-12 70 views
5

我修改了我在http://effbot.org/zone/django-multihost.htm找到的multihost.py中間件來動態設置設置.SITE_ID,但有一些擔心,我可能剛剛離開了預留。從Django的中間件安全地修改設置.SITE_ID?

我發現多個域託管的大多數示例都已經設置了多個settings.py文件,並將其硬編碼爲各自的SITE_ID。

我是否在這裏創建了一個致命的缺陷修復程序?動態地改變這個值會讓我對a **產生興趣。

from django.conf import settings 
from django.contrib.sites.models import Site 

class MultiHostMiddleware: 

    def process_request(self, request): 
     try: 
      host_raw = request.META["HTTP_HOST"] 
      colon = host_raw.find(':') 
      if colon > -1: 
       host = host_raw[0:colon] 
      else: 
       host = host_raw 

      s = Site.objects.get(domain=host) 
      if s: 
       settings.SITE_ID = s.id 

     except KeyError: 
      pass # use default urlconf (settings.ROOT_URLCONF) 

由於好奇,這是運行到目前爲止,但還沒有站起來的實際交通。

+0

不知道這是否可行,但我想知道是否使用'urlparse'會更好地獲取主機名(http://docs.python.org/library/urlparse.html)。 – 2010-08-12 08:08:36

+0

其他信息,這段代碼已經在2個域名站點上存在了大約一個星期,現在沒有明顯的故障。交通相當低,但我認爲這個概念是成立的。 – 2010-08-16 17:47:57

回答

6

簡短的官方回答是you're not supposed to do this,儘管文檔沒有真正解釋爲什麼不能。

如果您使用的是線程服務器,我會擔心競爭條件。這應該是相當簡單的測試;只需在一個視圖中撥打sleep(),然後返回帶有當前網站名稱的HttpResponse。在第一個視圖處於睡眠狀態時,在不同的域上點擊不同的視圖。

如果您使用prefork,我不認爲這會造成任何問題。我在matplotlib中使用了這種方法,因爲通過使用matplotlib.rcParams.update()更改全局配置來設置圖形屬性是最容易的。我使用prefork fcgi,所以我可以安全地假設每個請求都有自己的整個過程(夥計們,如果我錯了,請糾正我)。

編輯:我想你可以通過禁用sites應用程序做你想要使用的是什麼RequestSite。例如,James Bennett的django-registration在這種情況下實例化了一個RequestSite對象,該對象從請求對象中提取主機名。