2009-10-20 14 views
57

Tengo dos aplicaciones ubicadas en dos computadoras separadas. En el equipo A, en el archivo urls.py tengo una línea como la siguiente:URLs de django sin una barra diagonal no redirigir

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

Y esa URL a trabajar tanto para mySite.com/cast/ y mySite.com/cast. Pero en el ordenador BI tiene una URL similar en escrito como:

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

Por alguna razón en el equipo B del url mySite.com/login/funciona, pero mySite.com/login se bloqueará y ya no dirigirá de nuevo a mySite.com/login/ como lo hará en el sistema A. Es Hay algo que extrañé? Ambos archivos url.py son idénticos a mí.

Respuesta

73

comprobar los ajustes de APPEND_SLASH en el archivo settings.py

more info in the django docs

+2

"Cuando se establece en True, si el URL de la solicitud no coincide con ninguno de los patrones en la URLconf y no termina en una barra inclinada, se emite una redirección HTTP a la misma URL con una barra añadida. Tenga en cuenta que la redirección puede hacer que se pierdan los datos enviados en una solicitud POST ". "La configuración APPEND_SLASH solo se usa si está instalado CommonMiddleware ...". Prefiero la respuesta de Michael Gendin para una solución más limpia. – Wtower

+0

Esto no funciona si está usando una url adicional "atrapar todo" en la última entrada de sus patrones url. La respuesta de @ speedplane funcionará incluso en esas situaciones. Pero, por supuesto, esto es más simple y debería usarse si no hay entradas de urlpattern "captar todo". – np8

139

o puede escribir sus URL como esta:

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

El signo de interrogación después de la barra al final hace que sea opcional en regexp. Úselo si por alguna razón no quiere usar la configuración APPEND_SLASH.

+6

Llámame ingenuo, pero ¿por qué esta respuesta no tiene un millón de votos positivos y una entrada en el faq de django? –

+35

Bastante seguro de que no desea hacer esto por motivos de SEO; es mejor redireccionar a una URL canónica que tener dos URL válidas. –

+35

Si está creando una API RESTful utilizando Django, esta puede ser una buena solución cuando los desarrolladores transfieren datos directamente a la URL del punto final. Al usar 'APPEND_SLASH', si lo enviaron accidentalmente sin barra inclinada, y su urlconf está CON una barra inclinada, recibirían una excepción sobre la pérdida de datos al redirigir las solicitudes POST. – OrPo

0

He tenido el mismo problema. En mi caso fue una reminiscencia viciado de alguna versión antigua de urls.py, desde antes de staticfiles:

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

MEDIA_URL estaba vacía, por lo que este patrón coincide con todo.

2

Tuve el mismo problema también. Mi solución fue puesta (| /) antes de la línea final de mi expresión regular.

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

9

Esta mejora en la respuesta de @ Michael Gendin. Su respuesta sirve a la página idéntica con dos URL separadas. Sería mejor tener login redirigir automáticamente a login/, y luego servir a este último como su página principal:

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

¡Esta es una forma muy agradable y obvia! – Nevertheless

Cuestiones relacionadas