2009-10-20 5 views
57

ich zwei Anwendungen auf zwei separaten Computern befinden habe. Auf Computer A, in der urls.py Datei habe ich eine Zeile wie die folgenden:django Urls ohne einen Schrägstrich leitet nicht

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

Und das url funktioniert sowohl für mySite.com/cast/ und mySite.com/cast. Aber auf Computer BI haben eine ähnliche URL geschrieben wie:

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

Aus irgendeinem Grund auf Computer B die url mySite.com/login/arbeiten aber mySite.com/login wird hängen und wird nicht zurück zu mySite.com/login/ wie wird es auf Computer anweisen A. Ist da habe ich etwas verpasst? Beide url.py Dateien sehen identisch mit mir aus.

Antwort

73

überprüfen Sie Ihre APPEND_SLASH Einstellung in der Datei settings.py

more info in the django docs

+2

„Wenn auf True gesetzt, wenn die Anfrage-URL eine der Muster nicht in der URLconf übereinstimmen und es endet nicht in einem Schrägstrich, eine HTTP-Weiterleitung wird an die gleiche URL mit einem angehängten Schrägstrich ausgegeben. Beachten Sie, dass die Weiterleitung möglicherweise dazu führt, dass Daten, die bei einer POST-Anfrage übermittelt wurden, verloren gehen. "Die APPEND_SLASH-Einstellung wird nur verwendet, wenn CommonMiddleware installiert ist ...". Ich bevorzuge Michael Gendins Antwort für eine sauberere Lösung. – Wtower

+0

Dies funktioniert nicht, wenn Sie beim letzten Eintrag Ihres URL-Patterns die zusätzliche URL "catch all" verwenden. @ Speedplanes Antwort funktioniert auch in diesen Situationen. Aber das ist natürlich einfacher und sollte verwendet werden, wenn es keine "alle URL-Einträge" gibt. – np8

139

Oder Sie können Ihre Urls wie folgt schreiben:

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

Die Frage Zeichen nach dem Schrägstrich macht es optional in regexp. Verwenden Sie es, wenn Sie aus bestimmten Gründen die APPEND_SLASH-Einstellung nicht verwenden möchten.

+6

Nennt mich naiv - aber warum hat diese Antwort nicht eine Million Upvotes und einen Eintrag in der Django-FAQ? –

+35

Ziemlich sicher, dass Sie dies aus SEO-Gründen nicht tun möchten - besser auf eine kanonische URL umleiten als zwei gültige URLs haben. –

+35

Wenn Sie eine RESTful-API mit Django erstellen, kann dies eine gute Lösung sein, wenn Entwickler Daten direkt an die Endpunkt-URL senden. Wenn Sie 'APPEND_SLASH' verwenden, wenn sie versehentlich ohne abschließenden Schrägstrich gesendet wurden und Ihre URL-Datei mit einem nachgestellten Schrägstrich versehen ist, erhalten sie eine Ausnahme, wenn Daten beim Umleiten von POST-Anfragen verloren gehen. – OrPo

0

Ich habe das gleiche Problem hat. In meinem Fall war es ein schales Überbleibsel aus einer alten Version in urls.py, aus der Zeit vor Static:

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

MEDIA_URL war leer, so dass dieses Muster alles abgestimmt.

2

Ich habe auch das gleiche Problem hat. Meine Lösung war ein (| /) vor der Endlinie meines regulären Ausdrucks.

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

9

Dies verbessert auf @ Michael Gendin Antwort. Seine Antwort dient der identischen Seite mit zwei separaten URLs. Es wäre besser, login automatisch login/ umleiten zu haben, und diese dann als Haupt Seite dienen:

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

Dies ist eine sehr nette und offensichtliche Möglichkeit! – Nevertheless