Redirecionamento de página Python + Django


158

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

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/')),
)

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/')),
)

+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.


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.


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.


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


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/')),


1

page_path = define em urls.py

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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.