2009-03-09 8 views
35

मैं Django और Pinax का उपयोग कर एक नया वेब ऐप प्रोजेक्ट शुरू कर रहा हूं। मैं अपने उपयोगकर्ताओं को वर्डप्रेस और अन्य साइटों जैसे अद्वितीय डोमेन नाम देने में सक्षम होना चाहता हूं: username.wordpress.com। मुझे यकीन नहीं है कि Django के साथ इसका कैसे संपर्क करें, क्योंकि url पार्सिंग तर्क (urls.py में) डोमेन नाम के बाद यूआरएल से शुरू होता है।एक django वेब एप्लिकेशन में, आप उपयोगकर्ताओं को अपना सबडोमेन कैसे देते हैं?

अधिक विशेष रूप से, उपयोगकर्ताओं के कई समूह होंगे, प्रत्येक समूह का अद्वितीय नाम होगा। यकीन नहीं है कि एक फर्क पड़ता है, लेकिन मैंने सोचा कि मुझे इसका जिक्र करना चाहिए।

वहाँ किसी तरह मैं http अनुरोध में हेरफेर कर सकते हैं ताकि यूआरएल Django के लिए लग रहा है यूआरएल के रूप में अगर www.domain.com/groupname की तरह कुछ थे, लेकिन अभी भी groupname.domain.com के रूप में ब्राउज़र पता पट्टी में पता चला है?

+4

को विन्यस्त यह Django 1.2 में इसके लिए विचार किया जा रहा है: http://code.djangoproject.com/ticket/8896 –

+0

http://github.com/tkaemming/django -subdomains – Daryl

+0

पोस्टिंग के लिए धन्यवाद - अगली बार मुझे इसकी आवश्यकता होने पर मैं निश्चित रूप से यह जांच करूँगा (प्रोजेक्ट कि यह प्रश्न गिरने से संबंधित था)। –

उत्तर

24

आप अनुरोध को रोकने और उससे सबडोमेन प्राप्त करने के लिए कुछ कस्टम मिडलवेयर का उपयोग कर सकते हैं। निम्न कोड सबडोमेन पुनर्प्राप्त करेगा और reversing the named url द्वारा दृश्य पर रीडायरेक्ट करेगा।

इसे अपने ऐप में middleware.py फ़ाइल में रखें।

सुनिश्चित करें कि आप अपनी सेटिंग्स.py फ़ाइल में मिडलवेयर सेट अप करें।

middleware.py

from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
import re 

subdomain_pattern = re.compile('(?P<subdomain>.*?)\..*?') 

class SubdomainMiddleware(object): 
    def process_request(self, request): 
     match = subdomain_pattern.match(request.get_host()) 
     subdomain = match.group('subdomain') 
     redirect_url = reverse('groups_detail', args=[subdomain]) 
     return HttpResponseRedirect(redirect_url) 

urls.py

from django.conf.urls.defaults import * 

urlpatterns = patterns('', 
    url(r'^groups/(?P<name>.+)/$', 'groups.views.detail', {}, name='group_detail'), 
) 

नोट सुनिश्चित करें कि आप urls.py में आपके विचार नामित किया है: इस कोड है अपरीक्षित।

रीडायरेक्टिंग यूआरएल की उपस्थिति को बदल सकता है। यदि आप इससे बचना चाहते हैं, तो बस संबंधित दृश्य को कॉल करें, इसके परिणाम को कैप्चर करें, और इसे HttpResponse() में वापस कर दें।

+0

+1: मिडलवेयर ऐसा करने का सबसे अच्छा तरीका है, imho। वेबसर्वर/डीएनएस पक्ष पर, वाइल्डकार्ड सबडोमेन की जांच करें। – Tiago

+0

यह अच्छा लगता है। पूरी तरह से सुनिश्चित नहीं है कि अनुरोध के पथ को कैसे बदला जाए - क्या HttpRequest.build_absolute_uri (स्थान) वास्तव में पथ बदलता है, या बस एक स्ट्रिंग लौटाता है? मैं सीधे 'पथ' विशेषता को बदल सकता हूं, लेकिन दस्तावेज़ कहते हैं, "सत्र' को छोड़कर सभी विशेषताओं को केवल पढ़ने के लिए माना जाना चाहिए। –

+0

सबडोमेन ढूंढना मिश्रण का हिस्सा है। यदि यह काम करता है तो यह एक महान समाधान की तरह लगता है के बारे में सुना, लेकिन क्या आप अनुरोध यूआरएल को बदलने के लिए कोड के साथ पोस्ट अपडेट कर सकते हैं, इसलिए यह "असली" Django url को दर्शाता है? धन्यवाद (मेरे पास फिर से लिखने वाली साइट है और मुझे यह संभावना बहुत बेहतर पसंद है) –

2

आपको इसे अपने वेबसर्वर के माध्यम से संभालने की आवश्यकता है। यदि आपके पास Django जैसे URL ...

/users/<username>/ 

... तो वेब सर्वर में फिर से लिखने के नियमों का उपयोग करने के लिए domain.com/users/<username>/<username>.domain.com मैप करने के लिए।

यदि आप अपाचे का उपयोग कर रहे हैं, तो आप here पढ़ सकते हैं। अन्यथा, प्रत्येक वेबसर्वर का अपना सम्मेलन होता है लेकिन सभी यूआरएल रीराइट्स की धारणा का समर्थन करेंगे।

+0

ऐसा लगता है जैसे यह काम करेगा, और यहां तक ​​कि एक उदाहरण 'वर्चुअल होस्ट' भी है जो कि मैं चाहता हूं कि काफी समान है। लेकिन मैं किसी भी तरह से अपाचे व्यवस्थापक जैसा दिखता हूं, और वेब सर्वर कॉन्फ़िगरेशन में 'एप्लिकेशन तर्क' डालने से डरता हूं। इसके अलावा मुझे Django dev सर्वर के बजाय अपाचे पर विकसित करना होगा। –

+0

आप अभी भी dev सर्वर पर विकसित कर सकते हैं ... बस अपने टेम्पलेट्स में पूर्ण यूआरएल को इंगित न करें।मैं अपाचे conf फ़ाइलों के साथ putzing से भी नफरत है, लेकिन यह एक प्रतिलिपि और पेस्ट नौकरी है। –

+0

मैं उत्सुक हूँ। आपकी राय में क्या आपको लगता है कि मिडलवेयर का उपयोग करने से यह करने का यह एक बेहतर तरीका है? यह मेरे लिए थोड़ा क्लीनर लगता है। –