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

149

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

Теги:
redirect
location

10 ответов

218
Лучший ответ

Это просто:

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/')),
)
  • 8
    Это больше не лучший метод с Django 1.0. Смотрите этот ответ: stackoverflow.com/questions/523356/python-django-page-redirect/…
  • 2
    Почему бы не использовать redirect из django.shortcuts ?
Показать ещё 4 комментария
105

В зависимости от того, что вы хотите (т.е. если вы не хотите выполнять дополнительную предварительную обработку), проще просто использовать общий вид 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/')),
)
  • 0
    +1 за использование общего представления, а не за реализацию своего собственного (независимо от того, насколько просто), как в (текущем) ответе с наибольшим количеством голосов.
  • 0
    Кто - нибудь есть примеры, если вы хотите сделать дополнительную предварительную обработку?
Показать ещё 3 комментария
39

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

from django.http import HttpResponsePermanentRedirect

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

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

25

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

from django.shortcuts import redirect

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

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

12

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

В 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

6

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

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

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),
  • 0
    хорошо для 1,5 Джанго
1

page_path = define в urls.py

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")
  • 2
    deletePool ? Этот ответ кажется неуместным копировать-н-вставить ...
1

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

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

  • 0
    Хотя это не совсем относится к моему вопросу, это все же интересная информация.
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню