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 .

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')

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.


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).


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"),

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')),
]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.