Redirecionamento de página Python + Django

158

Como realizo um redirecionamento simples (por exemplo, cflocationno ColdFusion ou header(location:http://)PHP) no Django?

Kyle Hayes
fonte

Respostas:

250

É 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/')),
)
Baishampayan Ghose
fonte
8
Este não é mais o melhor método do Django 1.0. Veja esta resposta: stackoverflow.com/questions/523356/python-django-page-redirect/…
Jake
2
Por que não usar redirectde django.shortcuts?
Afshin Mehrabani
4
Eu uso('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey
5
Isso já está obsoleto a partir do Django 1.5. Use 'RedirectView': docs.djangoproject.com/en/1.5/ref/class-based-views/base/…
Yonatan
Na verdade, não está obsoleto, o que você está dizendo está obsoleto? redirecionar? Usando esse método, não sei como passar o valor dos parâmetros para lambda, ou seja, url (r '^ (? P <local_id>> d +) / $', lambda x: HttpResponseRedirect (reverse ('dailyreport_location', args = ['% (location_id)',]))) não funciona
radtek
113

Dependendo do que você deseja (ou seja, se você não deseja fazer nenhum pré-processamento adicional), é mais simples usar a redirect_tovisã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/')),
)
Carles Barrobés
fonte
+1 por usar uma visualização genérica em vez de implementar sua própria (não importa quão simples), como na resposta votada (atual).
Dia
Alguém tem qualquer exemplos para se você não quer fazer pré-processamento adicional?
eageranalyst
1
Então, sugiro que você escreva uma exibição personalizada que faça o processamento e depois chame a exibição genérica, ou escreva um decorador, por exemplo, pré-processo e decore a exibição genérica: (r '^ one / $', pré-processo (redirect_to), {'url ':' /
other
1
@niallsco: se você quiser fazer o processamento adicional, então é melhor usar o atalho de redirecionamento como descrito por Kennu em aqui
Lie Ryan
1
No django 1.4, a importação de redirect_to fornece um aviso de reprovação.
Joctee
38

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.

Urso de pelúcia
fonte
2
É verdade, mas usar a redirect_tovisã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/…
Dia
28

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.

Kennu
fonte
14

Se você deseja redirecionar uma subpasta inteira, o urlargumento 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 urlargumento que você forneceu, indicando /new_path/yay/mypathse 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.

odinho - Velmont
fonte
10

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

Zlatko
fonte
6

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

page_path = define em urls.py

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

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.

Radtek
fonte