Como realizo um redirecionamento simples (por exemplo, cflocation
no ColdFusion ou header(location:http://)
PHP) no Django?
Como realizo um redirecionamento simples (por exemplo, cflocation
no ColdFusion ou header(location:http://)
PHP) no Django?
Respostas:
É simples:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
Mais informações nos documentos oficiais do Django
Atualização: Django 1.0
Aparentemente, existe uma maneira melhor de fazer isso no Django agora usando generic views
.
Exemplo -
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Há mais na documentação das visualizações genéricas . Crédito - Carles Barrobés .
Atualização # 2: Django 1.3 ou superior
No Django 1.5, o redirect_to não existe mais e foi substituído pelo RedirectView . Crédito para Yonatan
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
redirect
de django.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
Dependendo do que você deseja (ou seja, se você não deseja fazer nenhum pré-processamento adicional), é mais simples usar a redirect_to
visão genérica do Django :
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Consulte a documentação para obter exemplos mais avançados.
Para o Django 1.3 ou superior, use:
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
Na verdade, existe uma maneira mais simples do que ter uma visualização para cada redirecionamento - você pode fazer isso diretamente em urls.py
:
from django.http import HttpResponsePermanentRedirect
urlpatterns = patterns(
'',
# ...normal patterns here...
(r'^bad-old-link\.php',
lambda request: HttpResponsePermanentRedirect('/nice-link')),
)
Um destino pode ser chamado e também uma string , que é o que estou usando aqui.
redirect_to
visão genérica que acompanha o django é mais simples ainda e mais legível. Veja a resposta de Carles stackoverflow.com/questions/523356/python-django-page-redirect/…
Desde o Django 1.1, você também pode usar o atalho de redirecionamento mais simples :
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
Também é necessário um argumento opcional opcional = True keyword.
Se você deseja redirecionar uma subpasta inteira, o url
argumento no RedirectView é realmente interpolado , para que você possa fazer algo assim em 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')),
]
A ?P<path>
captura que você capturar será inserida RedirectView
. Essa variável capturada será substituída no url
argumento que você forneceu, indicando /new_path/yay/mypath
se o caminho original era /old/yay/mypath
.
Você também pode fazer isso ….as_view(url='…', query_string=True)
se desejar copiar a sequência de consultas também.
Com o Django versão 1.3, a abordagem baseada em classe é:
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 exemplo reside em urls.py
Cuidado. Eu fiz isso em um servidor de desenvolvimento e queria alterá-lo mais tarde.
Eu tive que limpar meus caches para alterá-lo. Para evitar esse risco de cabeça no futuro, consegui torná-lo temporário da seguinte forma:
from django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
Você pode fazer isso na seção Admin. É explicado na documentação.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
Isso deve funcionar na maioria das versões do django, estou usando-o na 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'),
....
)
Você ainda pode usar o nome do padrão de URL em vez de um URL codificado com esta solução. O parâmetro location_id do URL é passado para a função lambda.