2009-10-20 12 views
57

İki ayrı bilgisayarda bulunan iki uygulama var. A bilgisayarında, urls.py dosyasında aşağıdaki gibi bir satır vardır:django URL'ler bir iz bırakmadan, yeniden yönlendirmiyor

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

Ve bu url mySite.com/cast/ ve mySite.com/cast ikisi için çalışacaktır. Ama bilgisayarda BI gibi dışarı hazırlanan benzer bir url var: B bilgisayarında Nedense

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

url mySite.com/login/çalışacaktır ancak mySite.com/login askıda kalacaktır ve bilgisayarda A. mı o olacak gibi geri mySite.com/login/ doğrudan olmayacak özlediğim bir şey mi var? Hem url.py dosyaları bana benziyor.

cevap

73

settings.py dosyasının

more info in the django docs

+2

"Gerçek ayarlandığında, istek URL'si URLconf ve içindeki desenlerin herhangi aynı değilse bir eğik çizgiyle sona ermiyorsa, bir URL yönlendirmesi eklenmiş bir bölü ile aynı URL'ye gönderilir. Yönlendirmenin bir POST isteğinde gönderilen verilerin kaybolmasına neden olabileceğini unutmayın. ". "APPEND_SLASH ayarı yalnızca CommonMiddleware kuruluysa ..." kullanılır. Michael Gendin'in daha temiz bir çözüm için verdiği cevabı tercih ederim. – Wtower

+0

Urlpatterns'larınızın son girdisinde ek "catch all" URL'si kullanıyorsanız, bu işe yaramaz. @ speedplane'nin cevabı bu durumlarda bile çalışacaktır. Ancak, elbette, bu daha basit ve "tüm" yakalamak "urlpattern girişleri varsa kullanılmalıdır. – np8

139

içinde APPEND_SLASH ayarını kontrol Ya da bunun gibi Url'lerinize yazabilirsiniz:

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

eğik çizgiyle sonra soru işareti o isteğe bağlı hale regexp'in. APPEND_SLASH ayarını kullanmak istemediğiniz bazı nedenlerden dolayı kullanın.

+6

Bana naif deyin - ama neden bu cevap bir milyon upvotes ve django faq bir giriş var? –

+35

SEO nedenleriyle bunu yapmak istemediğinizden emin olun - iki geçerli URL'den daha kanonik bir URL'ye yönlendirmek daha iyi. –

+35

Django kullanarak bir RESTful API'sı gönderiyorsanız, geliştiriciler POST verilerini doğrudan uç nokta URL'sine yönlendirdiğinde bu iyi bir çözüm olabilir. 'APPEND_SLASH' kullanırken, eğer yanlışlıkla yanlışlıkla eğik çizgi göndermeden gönderdiyseniz ve URL'nizde bir eğik çizgi varsa, POST isteklerini yeniden yönlendirirken veri kaybıyla ilgili bir istisna alırlar.o kadar kolay olduğundan daha sert (yeni sistemine geçmesine, sert korumak için, tarayıcılarının, özensiz kötü - bu çözüm ile – OrPo

0

Aynı sorunu yaşadım.

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

MEDIA_URL boş, bu yüzden bu model her şeyi eşleşti: Benim durumumda bu Statik Dosyalar önce gelen urls.py bazı eski sürümden bir bayat artık, oldu.

2

Ben de aynı problemi yaşadım. Benim çözümüm, düzenli ifademin bitiş çizgisinden önce bir (| /) koydu.

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

9

Bu @Michael Gendin cevabı üzerine geliştirir. Cevabı iki ayrı URL ile aynı sayfaya hizmet veriyor. Otomatik olarak login/ yönlendirmesi ve ardından ana sayfa olarak ikinci görev login olması daha iyi olurdu:

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

Bu çok güzel ve bariz bir yoldur! – Nevertheless

İlgili konular