it-swarm.com.ru

Django Перенаправление URL

Как я могу перенаправить трафик, который не соответствует ни одному из моих других URL-адресов, на домашнюю страницу?

rls.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 или 2.

90
felix001

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

163
dmg

В 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, вам не нужно также изменять перенаправление.

26
Rexford

Если вы застряли на 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).

9
Blaine Garrett

Еще один способ сделать это - использовать 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
sirFunkenstine