Przekierowanie adresu URL Django

102

Jak mogę przekierować ruch, który nie pasuje do żadnego z moich innych adresów URL, z powrotem na stronę główną?

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'),
)

W obecnej postaci ostatni wpis wysyła cały „inny” ruch na stronę główną, ale chcę przekierować za pośrednictwem protokołu HTTP 301 lub 302 .

felix001
źródło

Odpowiedzi:

182

Możesz wypróbować widok oparty na klasach o nazwie 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')
)

Zwróć uwagę, jak urlw przypadku <url_to_home_view>musisz faktycznie określić adres URL.

permanent=Falsezwróci HTTP 302, a permanent=Truezwróci HTTP 301.

Alternatywnie możesz użyć django.shortcuts.redirect

Aktualizacja dla wersji Django 2+

W przypadku Django 2+ url()jest przestarzałe i zastępowane przez re_path(). Sposób użycia jest dokładnie taki sam, jak url()w przypadku wyrażeń regularnych. W przypadku zamiany bez potrzeby wyrażenia regularnego użyj path().

from django.urls import re_path

re_path(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
dmg
źródło
dodałem to, ale właśnie dostałem błąd HTTP 500? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', permanent = False)
felix001
1
Wydaje się, że brakuje „)”, przewiń z boku do końca i zobaczysz to. Możesz jednak pominąć nameczęść
dmg
1
@ felix001 btw, HTTP 500 zwykle (tak jak w 99% przypadków) oznacza, że ​​masz błąd składniowy, spójrz na to - docs.djangoproject.com/en/dev/howto/error-reporting/… . Kiedy witryna jest w fazie rozwoju, zawsze dobrze jest mieć DEBUG = Truelub przynajmniej ustawić ADMINSopcję - docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
dmg
JAK to zrobić, przekazuję slug i używam tego pola do utworzenia adresu URL przekierowania. EXA: url (r '^ (? P <slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (url = 'http: //'+slug+'.mywebsite.com', permanent = Fałsz),)
Roshan
Zauważ, że używając tej metody, naprawdę łatwo jest złapać użytkownika w pętlę przekierowań.
bomba uśmiechnięta
35

W Django 1.8 tak zrobiłem swoje.

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))

Zamiast używać url, możesz użyć pattern_name, który jest nieco nie-SUCHY i zapewni zmianę adresu URL, nie musisz też zmieniać przekierowania.

KhoPhi
źródło
11

Jeśli utkniesz w django 1.2, tak jak ja, a RedirectView nie istnieje, innym sposobem dodania mapowania przekierowań jest użycie:

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

Możesz również zmienić trasę wszystkiego w meczu. Jest to przydatne, gdy zmieniasz folder aplikacji, ale chcesz zachować zakładki:

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

Jest to lepsze rozwiązanie niż django.shortcuts.redirect, jeśli tylko próbujesz zmodyfikować routing adresów URL i nie masz dostępu do .htaccess itp. (Korzystam z Appengine, a app.yaml nie zezwala na przekierowywanie adresów URL na tym poziomie .htaccess).

Blaine Garrett
źródło
3
Ten stary format jest przestarzały lub usunięty w nowych wersjach Django, ale nadal możesz używać słów kluczowych url podczas przekierowywania za pomocą RedirectView, jak opisano w zaakceptowanej odpowiedzi. Przykład:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter
9

Innym sposobem na to jest użycie HttpResponsePermanentRedirect w następujący sposób:

In view.py

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

W pliku url.py

url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),
sirFunkenstine
źródło
8

Inne metody działają dobrze, ale możesz też użyć starego, dobrego django.shortcut.redirect.

Poniższy kod został zaczerpnięty z tej odpowiedzi .

W 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')),
]
bomby
źródło