Перенаправление URL-адресов Django

102

Как я могу перенаправить трафик, который не соответствует ни одному из моих других 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 .

felix001
источник

Ответы:

182

Вы можете попробовать представление на основе классов под названием 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+

В Django 2+ url()он устарел и заменен на 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')
dmg
источник
Я добавил это, но получил ошибку HTTP 500? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', постоянный = False)
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
dmg
КАК передать slug и использовать это поле для создания URL-адреса перенаправления. EXA: url (r '^ (? P <slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (url = 'http: //'+slug+'.mywebsite.com', постоянный = False),)
Рошан
Обратите внимание, что с помощью этого метода очень легко застать пользователя в цикле перенаправления.
smilebomb
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-адрес, вам также не нужно менять перенаправление.

KhoPhi
источник
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"),
сэр
источник
9

Другие методы работают нормально, но вы также можете использовать старый добрый 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')),
]
бомбы
источник