Как выполнить простой переадресацию (например, cflocation
в ColdFusion или header(location:http://)
для PHP) в Django?
Перенаправление страницы Python + Django
Ответ 1
Это просто:
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...
)
В общая документация просмотров больше. Кредит - Carles Barrobés.
Обновление # 2: Django 1.3 +
В Django 1.5 redirect_to больше не существует и был заменен на RedirectView. Подпишитесь на Yonatan
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
Ответ 2
В зависимости от того, что вы хотите (т.е. если вы не хотите выполнять дополнительную предварительную обработку), проще просто использовать общий вид 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/')),
)
Ответ 3
На самом деле проще, чем иметь представление для каждого перенаправления - вы можете сделать это непосредственно в urls.py
:
from django.http import HttpResponsePermanentRedirect
urlpatterns = patterns(
'',
# ...normal patterns here...
(r'^bad-old-link\.php',
lambda request: HttpResponsePermanentRedirect('/nice-link')),
)
Цель может быть вызываемой, а также строкой, и именно это я использую здесь.
Ответ 4
С Django 1.1 вы также можете использовать более простой redirect ярлык:
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
Он также принимает необязательный константный аргумент keyword = True.
Ответ 5
Если вы хотите перенаправить целую подпапку, аргумент 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)
, если хотите также скопировать строку запроса.
Ответ 6
В 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
Ответ 7
Осторожно. Я сделал это на сервере разработки и хотел изменить его позже.
Мне пришлось очистить свои кеши, чтобы изменить его. Чтобы избежать этой царапины в будущем, я смог сделать это так:
from django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
Ответ 8
Вы можете сделать это в разделе администратора. Это объясняется в документации.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
Ответ 9
page_path = define в urls.py
def deletePolls(request):
pollId = deletePool(request.GET['id'])
return HttpResponseRedirect("/page_path/")
Ответ 10
Это должно работать в большинстве версий 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-адреса передается в лямбда-функцию.