Redirección de página Python + Django


158

¿Cómo realizo una redirección simple (por ejemplo, cflocationen ColdFusion o header(location:http://)para PHP) en Django?

Respuestas:


250

Es sencillo:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")

Más información en los documentos oficiales de Django

Actualización: Django 1.0

Aparentemente hay una mejor manera de hacer esto en Django ahora usando generic views.

Ejemplo

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',   
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

Hay más en la documentación de vistas genéricas . Crédito: Carles Barrobés .

Actualización n. ° 2: Django 1.3+

En Django 1.5 redirect_to ya no existe y ha sido reemplazado por RedirectView . Crédito a Yonatan

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

8
Este ya no es el mejor método a partir de Django 1.0. Vea esta respuesta: stackoverflow.com/questions/523356/python-django-page-redirect/…
Jake

2
¿Por qué no usar redirectdesde django.shortcuts?
Afshin Mehrabani

44
Yo uso('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey

55
Esto ya está en desuso a partir de Django 1.5. Utilice 'RedirectView' en su lugar: docs.djangoproject.com/en/1.5/ref/class-based-views/base/…
Yonatan

En realidad no está en desuso, ¿qué estás diciendo que está en desuso? redirigir? Utilizando este método, no sé cómo pasar el valor de los parámetros a lambda, es decir, url (r '^ (? P <location_id> \ d +) / $', lambda x: HttpResponseRedirect (reverse ('dailyreport_location', args = ['% (location_id)',]))) no funciona
radtek

113

Dependiendo de lo que desee (es decir, si no desea realizar ningún preprocesamiento adicional), es más simple usar la redirect_tovista genérica de Django :

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

Consulte la documentación para ver ejemplos más avanzados.


Para usar Django 1.3+:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

+1 por usar una vista genérica en lugar de implementar la suya propia (no importa cuán simple) como en la respuesta más votada (actual).
Día

¿Alguien tiene algún ejemplo de si usted no quiere hacer pre-procesamiento adicional?
eageranalyst

1
Luego sugeriría escribir una vista personalizada que procese y luego llame a la vista genérica, o escriba un decorador, por ejemplo, pre_process y decore la vista genérica: (r '^ one / $', pre_process (redirect_to), {'url ':' / another / '})
Carles Barrobés

1
@niallsco: si desea realizar un procesamiento adicional, entonces es mejor usar el acceso directo de redireccionamiento como lo describe Kennu aquí
Lie Ryan el

1
En django 1.4, la importación de redirect_to da una advertencia de depracación.
joctee

38

En realidad, hay una manera más simple que tener una vista para cada redirección: puede hacerlo directamente en urls.py:

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)

Un objetivo puede ser una cadena invocable y una cadena , que es lo que estoy usando aquí.


2
Es cierto, pero usar la redirect_tovista genérica que viene con django es aún más simple y más legible. Ver la respuesta de Carles stackoverflow.com/questions/523356/python-django-page-redirect/…
Día

28

Desde Django 1.1, también puede usar el acceso directo de redireccionamiento más simple :

from django.shortcuts import redirect

def myview(request):
    return redirect('/path')

También toma un argumento opcional permanente = True palabra clave.


14

Si desea redirigir una subcarpeta completa, el urlargumento en RedirectView está realmente interpolado , por lo que puede hacer algo como esto en urls.py:

from django.conf.urls.defaults import url
from django.views.generic import RedirectView

urlpatterns = [
    url(r'^old/(?P<path>.*)$', RedirectView.as_view(url='/new_path/%(path)s')),
]

El ?P<path>que captures será alimentado RedirectView. Esta variable capturada será reemplazada en el urlargumento que proporcionó, dándonos /new_path/yay/mypathsi su ruta original era /old/yay/mypath.

También puede hacerlo ….as_view(url='…', query_string=True)si desea copiar la cadena de consulta también.


10

Con Django versión 1.3, el enfoque basado en clases es:

from django.conf.urls.defaults import patterns, url
from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-url/$', RedirectView.as_view(url='/redirect-url/'), name='some_redirect'),
)

Este ejemplo vive en urls.py


6

Tener cuidado. Lo hice en un servidor de desarrollo y quería cambiarlo más tarde.

Tuve que limpiar mis cachés para cambiarlo. Para evitar este rascarse la cabeza en el futuro, pude hacerlo temporal de esta manera:

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),


1

page_path = define en urls.py

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")

0

Esto debería funcionar en la mayoría de las versiones de django, lo estoy usando en 1.6.5:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
urlpatterns = patterns('',
    ....
    url(r'^(?P<location_id>\d+)/$', lambda x, location_id: HttpResponseRedirect(reverse('dailyreport_location', args=[location_id])), name='location_stats_redirect'),
    ....
)

Todavía puede usar el nombre del patrón de URL en lugar de una URL codificada con esta solución. El parámetro location_id de la url se pasa a la función lambda.

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.