Redireccionamiento de URL de Django

101

¿Cómo puedo redirigir el tráfico que no coincide con ninguna de mis otras URL a la página de inicio?

urls.py:

urlpatterns = patterns('',
    url(r'^$', 'macmonster.views.home'),
    #url(r'^macmon_home$', 'macmonster.views.home'),
    url(r'^macmon_output/$', 'macmonster.views.output'),
    url(r'^macmon_about/$', 'macmonster.views.about'),
    url(r'^.*$',  'macmonster.views.home'),
)

Tal como está, la última entrada envía todo el "resto" del tráfico a la página de inicio, pero quiero redirigir a través de HTTP 301 o 302 .

felix001
fuente

Respuestas:

181

Puede probar la vista basada en clases llamada RedirectView

from django.views.generic.base import RedirectView

urlpatterns = patterns('',
    url(r'^$', 'macmonster.views.home'),
    #url(r'^macmon_home$', 'macmonster.views.home'),
    url(r'^macmon_output/$', 'macmonster.views.output'),
    url(r'^macmon_about/$', 'macmonster.views.about'),
    url(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
)

Observe cómo, como urlen el caso <url_to_home_view>, debe especificar la URL.

permanent=Falsedevolverá HTTP 302, mientras permanent=Trueque devolverá HTTP 301.

Alternativamente, puede usar django.shortcuts.redirect

Actualización para versiones de Django 2+

Con Django 2+, url()está obsoleto y reemplazado por re_path(). El uso es exactamente el mismo que url()con las expresiones regulares. Para reemplazos sin la necesidad de una expresión regular, use path().

from django.urls import re_path

re_path(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
maldición
fuente
Agregué esto pero acabo de recibir un error HTTP 500? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', permanente = False)
felix001
1
Parece que le falta un ")", desplácese lateral hasta el final y lo verá. Sin nameembargo
dmg
1
@ felix001 por cierto, HTTP 500 generalmente (como en el 99% de las veces) significa que tiene un error de sintaxis, eche un vistazo a esto: docs.djangoproject.com/en/dev/howto/error-reporting/… . Cuando un sitio está en desarrollo, siempre es bueno tener DEBUG = Trueo al menos configurar la ADMINSopción: docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
dmg
CÓMO hacerlo paso slug y uso ese campo para crear URL de redirección. EXA: url (r '^ (? P <slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (url = 'http: //'+slug+'.mywebsite.com', permanente = Falso),)
Roshan
Tenga en cuenta que con este método es muy fácil que el usuario quede atrapado en un bucle de redireccionamiento.
smilebomb
35

En Django 1.8, así es como hice el mío.

from django.views.generic.base import RedirectView

url(r'^$', views.comingSoon, name='homepage'),
# whatever urls you might have in here
# make sure the 'catch-all' url is placed last
url(r'^.*$', RedirectView.as_view(pattern_name='homepage', permanent=False))

En lugar de usar url, puede usar el pattern_name, que no está SECO, y se asegurará de cambiar su URL, no tiene que cambiar también la redirección.

KhoPhi
fuente
11

Si está atascado en django 1.2 como yo y RedirectView no existe, otra forma centrada en la ruta de agregar el mapeo de redireccionamiento es usando:

(r'^match_rules/$', 'django.views.generic.simple.redirect_to', {'url': '/new_url'}),  

También puede redirigir todo en un partido. Esto es útil cuando se cambia la carpeta de una aplicación pero se desea conservar los marcadores:

(r'^match_folder/(?P<path>.*)', 'django.views.generic.simple.redirect_to', {'url': '/new_folder/%(path)s'}),  

Esto es preferible a django.shortcuts.redirect si solo está intentando modificar el enrutamiento de su URL y no tiene acceso a .htaccess, etc. (estoy en Appengine y app.yaml no permite la redirección de URL en ese nivel como un .htaccess).

Blaine Garrett
fuente
3
Este formato antiguo está obsoleto o se eliminó en las nuevas versiones de Django, pero aún puede usar palabras clave de URL al redirigir usando RedirectView como se describe en la respuesta aceptada. Ejemplo:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter
9

Otra forma de hacerlo es usando HttpResponsePermanentRedirect así:

En view.py

def url_redirect(request):
    return HttpResponsePermanentRedirect("/new_url/")

En la url.py

url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),
sirFunkenstine
fuente
8

Los otros métodos funcionan bien, pero también puedes usar los buenos django.shortcut.redirect.

El código a continuación se tomó de esta respuesta .

En Django 2.x:

from django.shortcuts import redirect
from django.urls import path, include

urlpatterns = [
    # this example uses named URL 'hola-home' from app named hola
    # for more redirect's usage options: https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/
    path('', lambda request: redirect('hola/', permanent=True)),
    path('hola/', include('hola.urls')),
]
bombas
fuente