Подтвердить что ты не робот

Перенаправление 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.

4b9b3361

Ответ 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),
]