2009-10-20 5 views
57

रीडायरेक्ट नहीं करता है मेरे पास दो अलग-अलग कंप्यूटरों पर दो अनुप्रयोग हैं। कंप्यूटर एक पर, urls.py फ़ाइल में मैं निम्नलिखित की तरह एक लाइन है:पीछे की स्लैश के बिना django urls

(r'^cast/$', 'mySite.simulate.views.cast') 

और वह यूआरएल mySite.com/cast/ और mySite.com/cast दोनों के लिए काम करेंगे। लेकिन कंप्यूटर पर बीआई एक समान यूआरएल की तरह बाहर लिखा है:

(r'^login/$', 'mySite.myUser.views.login') 

कंप्यूटर बी पर किसी कारण से url mySite.com/login/कार्य करेगी, लेकिन mySite.com/login रखती हूँ और इस तरह कंप्यूटर पर ए है कहीं भी होगी वापस mySite.com/login/ पर नहीं ले जाएगा क्या मुझे कुछ याद आया? url.py दोनों फाइलें मेरे समान दिखती हैं।

उत्तर

73

settings.py फ़ाइल

more info in the django docs

+2

"जब True पर सेट है, अगर अनुरोध URL URLconf और उस में पैटर्न में से किसी से मेल नहीं खाता स्लैश में समाप्त नहीं होता है, एक ही यूआरएल पर एक HTTP रीडायरेक्ट एक स्लैश संलग्न के साथ जारी किया जाता है। ध्यान दें कि रीडायरेक्ट POST अनुरोध में खोए गए किसी भी डेटा को खोने का कारण बन सकता है। " "एपीपी END_SLASH सेटिंग केवल तभी उपयोग की जाती है जब कॉमनमिडवेयर स्थापित हो ..."। मैं एक क्लीनर समाधान के लिए माइकल Gendin के जवाब पसंद करते हैं। – Wtower

+0

यदि आप अपने urlpatterns की अंतिम प्रविष्टि में अतिरिक्त "कैच ऑल" यूआरएल का उपयोग कर रहे हैं तो यह काम नहीं करता है। @ स्पीडप्लेन का जवाब उन परिस्थितियों में भी काम करेगा। लेकिन, ज़ाहिर है, यह आसान है और अगर इस्तेमाल नहीं किया जाता है तो "सभी को पकड़ें" urlpattern प्रविष्टियां हैं। – np8

139

में अपने APPEND_SLASH सेटिंग की जाँच करें या आप इस तरह अपने यूआरएल लिख सकते हैं:

(r'^login/?$', 'mySite.myUser.views.login') 

स्लैश के बाद प्रश्न चिन्ह उस में वैकल्पिक बना देता है regexp। अगर आप कुछ कारणों से एपीपी END_SLASH सेटिंग का उपयोग नहीं करना चाहते हैं तो इसका इस्तेमाल करें।

+6

मुझे बेवकूफ कहें - लेकिन इस जवाब को दस लाख अपवॉट्स और डीजेंगो फोक में प्रवेश क्यों नहीं मिला है? –

+35

बहुत यकीन है कि आप इसे एसईओ कारणों से नहीं करना चाहते हैं - दो वैध यूआरएल के मुकाबले एक कैनोलिक यूआरएल पर रीडायरेक्ट करना बेहतर है। –

+35

यदि आप Django का उपयोग करके एक विश्वसनीय API बना रहे हैं, तो यह एक अच्छा समाधान हो सकता है जब डेवलपर सीधे डेटा को एंडपॉइंट URL पर पोस्ट करते हैं। 'APPEND_SLASH' का उपयोग करते समय, यदि उन्होंने गलती से इसे स्लैश के बिना भेज दिया है, और आपका urlconf पीछे की ओर स्लैश के साथ है तो उन्हें POST अनुरोधों को पुनर्निर्देशित करते समय डेटा खोने के बारे में अपवाद प्राप्त होगा। – OrPo

0

मुझे एक ही समस्या है।

url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 
    'django.views.static.serve', 
    kwargs={'document_root': settings.MEDIA_ROOT}), 

MEDIA_URL था खाली, इसलिए इस पद्धति सब कुछ का मिलान नहीं हुआ: मेरे मामले में यह urls.py में कुछ पुराने संस्करण से एक बासी बचे हुए, StaticFiles से पहले से था।

2

मुझे भी यही समस्या है। मेरा समाधान मेरी नियमित अभिव्यक्ति की अंतिम पंक्ति से पहले (| /) डाल दिया गया था।

url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),

9

यह @Michael Gendin के जवाब पर बेहतर बनाता है। उनका जवाब दो अलग-अलग यूआरएल वाले समान पृष्ठ परोसता है। बेहतर होगा कि login के लिए स्वचालित रूप से login/ पर पुन: निर्देशित, और फिर मुख्य पृष्ठ के रूप में उत्तरार्द्ध की सेवा:

from django.conf.urls import patterns 
from django.views.generic import RedirectView 

urlpatterns = patterns('', 
    # Redirect login to login/ 
    (r'^login$', RedirectView.as_view(url = '/login/')), 
    # Handle the page with the slash. 
    (r'^login/', "views.my_handler"), 
) 
+2

यह एक बहुत अच्छा और स्पष्ट तरीका है! – Nevertheless