Переадресація URL-адреси Джанго


101

Як я можу переадресувати трафік, який не відповідає жодному з інших моїх URL-адрес, на головну сторінку?

urls.py:

urlpatterns = patterns('',
    url(r'^$', 'macmonster.views.home'),
    #url(r'^macmon_home$', 'macmonster.views.home'),
    url(r'^macmon_output/$', 'macmonster.views.output'),
    url(r'^macmon_about/$', 'macmonster.views.about'),
    url(r'^.*$',  'macmonster.views.home'),
)

На даний момент останній запис надсилає весь "інший" трафік на головну сторінку, але я хочу переспрямувати або через HTTP 301, або 302 .

Відповіді:


181

Ви можете спробувати перегляд на основі класу, який називається RedirectView

from django.views.generic.base import RedirectView

urlpatterns = patterns('',
    url(r'^$', 'macmonster.views.home'),
    #url(r'^macmon_home$', 'macmonster.views.home'),
    url(r'^macmon_output/$', 'macmonster.views.output'),
    url(r'^macmon_about/$', 'macmonster.views.about'),
    url(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
)

Зверніть увагу, як urlу цьому <url_to_home_view>вам потрібно фактично вказати URL-адресу.

permanent=Falseповерне HTTP 302, тоді як permanent=Trueповерне HTTP 301.

Можна також використовувати django.shortcuts.redirect

Оновлення для версій Django 2+

Що url()стосується Django 2+, це застаріле і замінене на re_path(). Використання точно таке ж, як url()і для регулярних виразів. Для заміни без необхідності регулярного вираження використовуйте path().

from django.urls import re_path

re_path(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')

я додав це, але щойно отримав помилку HTTP 500? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', постійний = Неправдивий)
felix001

1
Вам здається, що пропущено ")", бічна прокрутка до кінця, і ви побачите це. Ви можете опустити nameчастину
dmg

1
@ felix001 btw, HTTP 500 зазвичай (як у 99% разів) означає, що у вас є синтаксична помилка, погляньте на це - docs.djangoproject.com/en/dev/howto/error-reporting/… . Коли сайт знаходиться в стадії розробки, завжди добре мати DEBUG = Trueабо , по крайней мере , встановити ADMINSопцію - docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
дамага

ЯК мені пройти слугу та використовувати це поле для створення URL-адреса переадресації. EXA: url (r '^ (? P <slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (url = 'http: //'+slug+'.mywebsite.com', постійний = Неправда),)
Рошань

Зауважте, що за допомогою цього методу дійсно легко застати користувача в циклі переадресації.
усмішка

35

У Django 1.8 ось так я зробив свою.

from django.views.generic.base import RedirectView

url(r'^$', views.comingSoon, name='homepage'),
# whatever urls you might have in here
# make sure the 'catch-all' url is placed last
url(r'^.*$', RedirectView.as_view(pattern_name='homepage', permanent=False))

Замість використання urlви можете використовувати функцію pattern_name, яка трохи не суха, і переконаєтесь, що ви змінюєте URL-адресу, вам також не потрібно змінювати переадресацію.


11

Якщо ви застрягли на django 1.2, як я, і RedirectView не існує, використовується інший спосіб, який орієнтований на маршрут, для додавання перенаправлення:

(r'^match_rules/$', 'django.views.generic.simple.redirect_to', {'url': '/new_url'}),  

Ви також можете перенаправити все на матч. Це корисно при зміні папки програми, але бажаючи зберегти закладки:

(r'^match_folder/(?P<path>.*)', 'django.views.generic.simple.redirect_to', {'url': '/new_folder/%(path)s'}),  

Це краще, ніж django.shortcuts.redirect, якщо ви лише намагаєтесь змінити маршрутизацію URL-адреси та не маєте доступу до .htaccess тощо. (Я перебуваю на Appengine та app.yaml не дозволяє перенаправлення URL-адреси на такому рівні, як .htaccess).


3
Цей старий формат застарілий або видалений у нових версіях Django, але ви все одно можете використовувати ключові слова URL під час перенаправлення за допомогою RedirectView, як описано у прийнятій відповіді. Приклад:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Міхей Вальтер

9

Інший спосіб зробити це, використовуючи HttpResponsePermanentRedirect так:

У view.py

def url_redirect(request):
    return HttpResponsePermanentRedirect("/new_url/")

В url.py

url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),

8

Інші методи працюють добре, але ви також можете використовувати старий добрий django.shortcut.redirect.

Код нижче взятий з цієї відповіді .

У Django 2.x:

from django.shortcuts import redirect
from django.urls import path, include

urlpatterns = [
    # this example uses named URL 'hola-home' from app named hola
    # for more redirect's usage options: https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/
    path('', lambda request: redirect('hola/', permanent=True)),
    path('hola/', include('hola.urls')),
]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.