2010-08-12 12 views
5

Ayarları dinamik olarak ayarlamak için http://effbot.org/zone/django-multihost.htm adresinde bulduğum multihost.py ara katmanını dinamik olarak değiştirdim, ancak rezervasyondan yeni çıkmış olabileceğime dair bazı endişelerim var.Django'da middleware'den settings.SITE_ID dosyasını değiştirmek için güvenli misiniz?

Birden çok etki alanı barındırma için bulduğum çoğu örnek, ilgili SITE_ID'lerine kodlanmış birden çok settings.py dosyasıyla kuruldu.

Burada ölümcül bir kusur ile bir düzeltme oluşturdunuz mu? Bu değerin değişmesi beni dinamik olarak ısırıyor.

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) 

Merak için, bu şimdiye kadar çalışıyor ve çalışıyor, ancak gerçek trafiğe çıkmadı.

+0

Bunun işe yarayıp yaramadığına dair bir fikir yok, ama 'urlparse' kullanmanın ana bilgisayar adını almak için daha iyi olup olmayacağını merak ediyorum (http://docs.python.org/library/urlparse.html). –

+0

Ek bilgi, bu kod yaklaşık bir hafta boyunca 2 etki alanı sitesinde yer aldı ve görünür bir hata oluşmadı. Oldukça alçak trafik ama kavramın geçerli olduğunu düşünüyorum. –

cevap

6

Kısa, resmi yanıt you're not supposed to do this, ancak dokümanlar gerçekten neden olmadığını açıklamıyor.

Dişli bir sunucu kullanıyorsanız, bir yarış durumuyla ilgili kaygılanırdım. Bunun test edilmesi oldukça basit olmalı; Sadece bir görünümde sleep() numarasına bir çağrı koyun, ardından mevcut sitenin adıyla bir HttpResponse döndürün. İlk görünüm uyurken, farklı bir alanda farklı bir görünüme sahip olun.

Eğer ön kalıp kullanıyorsanız, bunun herhangi bir soruna yol açacağını düşünmüyorum. Bu yaklaşımı matplotlib ile kullandım, çünkü matplotlib.rcParams.update() ile global yapılandırmayı değiştirerek grafik özelliklerini ayarlamak en kolay yoldur. Ben prefork fcgi kullanıyorum, bu yüzden her isteğin kendi başına tüm sürecin olduğunu kabul edebilirim (millet, lütfen yanılıyorsam beni düzeltin).

Düzenleme: Sanasites uygulama devre dışı bırakarak tarafından size RequestSite kullanarak istediğiniz ne yapabilirim düşünüyorum. Örneğin, James Bennett'in django-registration, bu durumda, ana makine adını istek nesnesinden ayıklayan bir RequestSite nesnesini başlatır.