Перенаправление страницы Python + Django
Вопрос
Как выполнить простое перенаправление (например. cflocation
в ColdFusion или header(location:http://)
для PHP) в Django?
Решение
Это просто:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
Больше информации в официальная документация Django
Обновлять:Джанго 1.0
Очевидно, теперь в Django есть лучший способ сделать это, используя generic views
.
Пример -
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Есть еще в документация по общим представлениям.Кредит - Карлес Барробес.
Обновление №2:Джанго 1.3+
В Джанго 1.5 перенаправление_то больше не существует и был заменен ПеренаправлениеView.Кредит Йонатан
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.
Если вы хотите перенаправить всю подпапку, url
аргумент в RedirectView фактически интерполируется, поэтому вы можете сделать что-то подобное в 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')),
]
А ?P<path>
вы захватите, будет передано в RedirectView
.Эта захваченная переменная затем будет заменена в url
аргумент, который вы дали, давая нам /new_path/yay/mypath
если ваш первоначальный путь был /old/yay/mypath
.
Вы также можете сделать ….as_view(url='…', query_string=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'),
)
Этот пример находится в 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-адреса передается в лямбда-функцию.