¿Cómo realizo una redirección simple (por ejemplo, cflocation
en ColdFusion o header(location:http://)
para PHP) en Django?
¿Cómo realizo una redirección simple (por ejemplo, cflocation
en ColdFusion o header(location:http://)
para PHP) en Django?
Respuestas:
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/')),
)
redirect
desde django.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
Dependiendo de lo que desee (es decir, si no desea realizar ningún preprocesamiento adicional), es más simple usar la redirect_to
vista 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/')),
)
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í.
redirect_to
vista 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/…
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.
Si desea redirigir una subcarpeta completa, el url
argumento 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 url
argumento que proporcionó, dándonos /new_path/yay/mypath
si 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.
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
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/')),
Puede hacer esto en la sección Admin. Se explica en la documentación.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
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.