2010-08-12 6 views
5

मैंने सेटिंग्स सेट करने के लिए http://effbot.org/zone/django-multihost.htm पर मिली multihost.py मिडलवेयर को संशोधित किया है। SITE_ID गतिशील रूप से, लेकिन कुछ चिंताएं हैं जिन्हें मैंने अभी आरक्षण छोड़ दिया होगा।Django में मिडलवेयर से सेटिंग्स SITE_ID को संशोधित करने के लिए सुरक्षित?

एकाधिक डोमेन होस्टिंग के लिए मुझे मिले अधिकांश उदाहरण कई सेटिंग्स.py फ़ाइलों के साथ सेट किए गए हैं जो उनके संबंधित SITE_IDs में हार्डकोड किए गए हैं।

क्या मैंने यहां एक घातक दोष के साथ एक फिक्स बनाया है? इस मूल्य को बदलकर गतिशील रूप से मुझे ** पर काट देगा।

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

कोई विचार नहीं कि यह काम करेगा या नहीं, लेकिन मुझे आश्चर्य है कि होस्ट नाम (http://docs.python.org/library/urlparse.html) प्राप्त करने के लिए 'urlparse' का उपयोग करना बेहतर होगा या नहीं। –

+0

अतिरिक्त जानकारी, यह कोड लगभग 2 सप्ताह के लिए 2 डोमेन साइट पर मौजूद है, जिसमें कोई स्पष्ट ग्लिच नहीं है। काफी कम यातायात लेकिन मुझे लगता है कि अवधारणा रखती है। –

उत्तर

6

संक्षिप्त, आधिकारिक उत्तर you're not supposed to do this है, हालांकि दस्तावेज़ वास्तव में क्यों नहीं समझाते हैं।

यदि आप थ्रेडेड सर्वर का उपयोग कर रहे हैं, तो मुझे दौड़ की स्थिति के बारे में चिंतित होगा। यह परीक्षण करने के लिए काफी सरल होना चाहिए; बस एक दृश्य में sleep() पर कॉल करें, फिर वर्तमान साइट के नाम के साथ HttpResponse वापस करें। जबकि पहला विचार सो रहा है, एक अलग डोमेन पर एक अलग दृश्य मारा।

यदि आप प्रीफ़र्क का उपयोग करते हैं, तो मुझे कल्पना नहीं है कि इससे कोई समस्या होगी। मैंने matplotlib के साथ इस दृष्टिकोण का उपयोग किया है, क्योंकि matplotlib.rcParams.update() के साथ वैश्विक कॉन्फ़िगरेशन को बदलकर ग्राफ गुणों को सेट करना सबसे आसान है। मैं prefork fcgi का उपयोग करता हूं, इसलिए मैं सुरक्षित रूप से मान सकता हूं कि प्रत्येक अनुरोध में पूरी प्रक्रिया है (दोस्तों, अगर मैं गलत हूं तो कृपया मुझे सही करें)।

संपादित: मुझे लगता है आप sites आवेदन को अक्षम करके क्या आप RequestSite का उपयोग कर करना चाहते हैं कर सकते हैं। जेम्स बेनेट की django-registration, उदाहरण के लिए, उस मामले में RequestSite ऑब्जेक्ट को तुरंत चालू करता है, जो अनुरोध ऑब्जेक्ट से होस्टनाम निकालता है।

संबंधित मुद्दे