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

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

    Это просто:

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

    В общей документации есть больше. Кредит – Карлес Барробес .

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

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

     from django.views.generic import RedirectView urlpatterns = patterns('', (r'^one/$', RedirectView.as_view(url='/another/')), ) 

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

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

    Он также принимает необязательный аргумент константы = 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 нам /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

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

    • Перенаправление 301 кэширования Firefox 5

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

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