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.