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?

Kyle Hayes
fuente

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/')),
)
Baishampayan Ghose
fuente
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/')),
)
Carles Barrobés
fuente
+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í.

Osito de peluche
fuente
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.

Kennu
fuente
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.

odinho - Velmont
fuente
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

Zlatko
fuente
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/')),
Gringo Suave
fuente
1

page_path = define en urls.py

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")
Moddasir
fuente
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.

radtek
fuente