Перенаправление страницы Python + Django - PullRequest
154 голосов
/ 07 февраля 2009

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

Ответы [ 10 ]

243 голосов
/ 07 февраля 2009

Все просто:

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 . Кредит Йонатан

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)
113 голосов
/ 01 октября 2010

В зависимости от того, что вы хотите (то есть, если вы не хотите выполнять какую-либо дополнительную предварительную обработку), проще просто использовать общий вид 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/')),
)
38 голосов
/ 17 января 2010

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

from django.http import HttpResponsePermanentRedirect

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

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

26 голосов
/ 05 сентября 2010

Начиная с Django 1.1, вы также можете использовать более простой ярлык redirect :

from django.shortcuts import redirect

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

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

14 голосов
/ 10 марта 2014

Если вы хотите перенаправить целую подпапку, аргумент 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), если вы также хотите скопировать строку запроса.

10 голосов
/ 14 сентября 2011

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

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

6 голосов
/ 06 ноября 2012

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

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

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),
1 голос
/ 12 июля 2013

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

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")
1 голос
/ 21 февраля 2012

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

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

0 голосов
/ 12 июня 2014

Это должно работать в большинстве версий 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-адреса передается в лямбда-функцию.

...