2009-10-20 2 views
57

Ho due applicazioni situate su due computer separati. Sul computer A, nel file urls.py Ho una linea come la seguente:URL django senza barra finale non reindirizzano

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

E questo URL funzionare sia per mySite.com/cast/ e mySite.com/cast. Ma sul computer BI hanno un URL simile scritto fuori come:

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

Per qualche ragione sul computer B al url mySite.com/login/funzionerà ma mySite.com/login si bloccherà e non riesca a dirigere di nuovo a mySite.com/login/ come lo farà sul computer A. E ' c'è qualcosa che ho perso? Entrambi i file url.py sembrano identici a me.

risposta

73

controllare l'impostazione APPEND_SLASH nel file settings.py

more info in the django docs

+2

"Se impostato su True, se l'URL della richiesta non corrisponde a nessuno dei modelli in URLconf e non termina con una barra, un reindirizzamento HTTP viene emesso sullo stesso URL con una barra aggiunta. Si noti che il reindirizzamento potrebbe causare la perdita di tutti i dati inviati in una richiesta POST. ". "L'impostazione APPEND_SLASH è utilizzata solo se CommonMiddleware è installato ...". Preferisco la risposta di Michael Gendin per una soluzione più pulita. – Wtower

+0

Questo non funziona se si utilizza l'ulteriore url "catch all" all'ultima voce del proprio urlpatterns. La risposta di @ speedplane funzionerà anche in quelle situazioni. Ma, ovviamente, questo è più semplice e dovrebbe essere usato se non ci sono "urlpattern". – np8

139

Oppure si può scrivere gli URL come questo:

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

Il segno di domanda dopo la barra finale rende facoltativo regexp. Usalo se per qualche motivo non vuoi usare l'impostazione APPEND_SLASH.

+6

Chiamami ingenuo - ma perché questa risposta non ha ottenuto un aumento di milioni e una voce nel django faq? –

+35

Piuttosto sicuro di non voler fare questo per ragioni SEO - meglio reindirizzare a un URL canonico che avere due URL validi. –

+35

Se cretti un'API RESTful utilizzando Django, questa può essere una buona soluzione quando gli sviluppatori POST dati direttamente all'URL endpoint. Quando si utilizza 'APPEND_SLASH', se l'hanno inviato accidentalmente senza barra finale e il tuo urlconf è WITH una barra finale, otterrebbe un'eccezione sulla perdita dei dati durante il reindirizzamento delle richieste POST. – OrPo

0

Ho avuto lo stesso problema. Nel mio caso si trattava di un avanzo stantio da qualche vecchia versione in urls.py, da prima staticfiles:

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

MEDIA_URL era vuota, quindi questo modello abbinato tutto.

2

Ho avuto lo stesso problema anche io. La mia soluzione è stata messa un (| /) prima della fine della mia espressione regolare.

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

9

Questo migliora la risposta di @ Michael Gendin. La sua risposta serve la stessa pagina con due URL separati. Sarebbe meglio avere login reindirizzare automaticamente login/, e poi seguire i secondi come pagina principale:

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

Questo è un modo molto carino e ovvio! – Nevertheless