Перенаправление страницы Python + Django

Как выполнить простое перенаправление (например,cflocation в ColdFusion, или header(location:http://) для PHP) в Django?

10 ответов


все просто:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")

подробнее на официальные документы Django

Обновление: Django 1.0

по-видимому, есть лучший способ сделать это в Django теперь с помощью generic views.

пример

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',   
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

есть еще в общие представления документации. Кредит -Barrobés Карлес.

Обновление #2: Django 1.3+

In Django 1.5 redirect_to больше не существует и был заменен RedirectView. Кредит Йони

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

В зависимости от того, что вы хотите (т. е. если вы не хотите делать дополнительную предварительную обработку), проще просто использовать Django redirect_to универсальный вид:

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

посмотреть документация для более сложных примеров.


для Django 1.3+ использовать:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

на самом деле есть более простой способ, чем иметь представление для каждого перенаправления - вы можете это сделать напрямую на urls.py:

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)

цель может быть вызываемой, а также строкой, который я использую здесь.


поскольку Django 1.1, вы также можете использовать более простой редирект ярлык:

from django.shortcuts import redirect

def myview(request):
    return redirect('/path')

Он также принимает необязательный аргумент ключевого слова permanent=True.


если вы хотите перенаправить все папке


С Django версии 1.3, подход на основе класса:

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

этот пример живет в in urls.py


остерегайтесь. Я сделал это на сервере разработки и хотел изменить его позже.

мне пришлось очистить кэш, чтобы изменить его. Чтобы избежать этого чесания головы в будущем, я смог сделать его временным, например:

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),

вы можете сделать это в админке. Это объясняется в документации.

https://docs.djangoproject.com/en/dev/ref/contrib/redirects/


page_path = определить в urls.py

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

Это должно работать в большинстве версий django, я использую его в 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'),
    ....
)

вы все еще можете использовать имя шаблона url вместо жестко закодированного url с этим решением. Параметр location_id из url передается в лямбда-функцию.