Перенаправление URL-адреса Django
Как я могу перенаправить трафик, который не соответствует ни одному из моих других 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.
Ответы
Ответ 1
Вы можете попробовать Class Based View, названный 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
Ответ 2
В 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-адреса, вам также не придется менять перенаправление.
Ответ 3
Если вы застряли на 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).
Ответ 4
Другой способ сделать это - использовать HttpResponsePermanentRedirect так:
В view.py
def url_redirect(request):
return HttpResponsePermanentRedirect("/new_url/")
В url.py
url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),
Ответ 5
Другие методы работают хорошо, но вы также можете использовать старый добрый django.shortcut.redirect
.
Код ниже взят из этого ответа r
В Django 2.x,
from django.contrib import admin
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 usage options: https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/
path('', lambda request: redirect('hola/', permanent=False)),
path('hola/', include("hola.urls")),
path('admin/', admin.site.urls),
]