Перенаправлення сторінки Python + Django


Відповіді:


250

Це просто:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")

Більше інформації в офіційних документах Django

Оновлення: Django 1.0

Мабуть, кращий спосіб зробити це в Джанго зараз, використовуючи generic views.

Приклад -

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',   
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

Більше в документації на загальні погляди . Кредит - Carles Barrobés .

Оновлення №2: Джанго 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
Я використовую('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey

5
Це вже застаріло, починаючи з Django 1.5. Використовуйте 'RedirectView' замість: docs.djangoproject.com/en/1.5/ref/class-based-views/base / ...
Йонатан

Її насправді не застаріло, а ти що, кажеш, застаріло? перенаправлення? Використовуючи цей метод, я не знаю, як передати значення параметрів лямбда, тобто url (r '^ (? P <location_id> \ d +) / $', lambda x: HttpResponseRedirect (зворотний ('dailyreport_location', args = ['% (location_id)',]))) не працює
radtek

113

Залежно від того, що ви хочете (тобто якщо ви не хочете робити додаткову попередню обробку), простіше просто використовувати redirect_toзагальний вигляд Django :

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

+1 за використання загального перегляду, а не для здійснення власного (незалежно від того, наскільки просто), як у (поточній) голосовій відповіді вгорі.
День

Хто - небудь є приклади , якщо ви дійсно хочете зробити додаткову попередню обробку?
eageranalyst

1
Тоді я б запропонував або написати спеціальний вигляд, який виконує обробку, а потім викликає загальний вигляд, або написати декоратор, наприклад, pre_process і прикрасити загальний вигляд: (r '^ one / $', pre_process (redirect_to), {'url ':' / інший / '})
Carles Barrobés

1
@niallsco: якщо ви хочете зробити додаткову обробку, то краще скористатися ярликом для переадресації, як описано Кенну тут
Lie Ryan

1
У django 1.4 імпорт redirect_to подає попередження про усунення.
Joctee

38

Насправді є простіший спосіб, ніж перегляд кожного перенаправлення - це можна зробити безпосередньо в urls.py:

from django.http import HttpResponsePermanentRedirect

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

Ціль може бути як дзвінка, так і рядка , що я тут використовую.


2
Щоправда, але використовувати redirect_toзагальний вигляд, який поставляється з джанго, все ще простіше і читабельніше. Дивіться відповідь Карлеса stackoverflow.com/questions/523356/python-django-page-redirect/…
День

28

Оскільки Django 1.1, ви також можете використовувати більш простий ярлик для переадресації :

from django.shortcuts import redirect

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

Він також бере необов'язковий постійний = аргумент ключового слова True.


14

Якщо ви хочете перенаправити цілу підпапку, 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/')),


1

page_path = визначте в urls.py

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")

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-адреси передається до функції лямбда.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.