Перенаправление страницы 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 передается в лямбда-функцию.