2013-02-19 32 views
76

Jak mogę przekierować ruch, który nie pasuje do żadnego z moich innych adresów URL z powrotem do strony głównej. Moje urls.py wygląda,Przekierowanie adresu URL Django

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 ostatni wpis wysyła wszystkie „inne” ruch na stronie głównej, ale chcę, aby przekierować albo poprzez HTTP 301 lub 302.

dzięki,

Odpowiedz

131

można spróbować Based View klasy 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') 
) 

Wskazówki jak jak url w <url_to_home_view> musisz faktycznie podać adres URL.

permanent=False powróci HTTP 302, natomiast permanent=True powróci HTTP 301.

alternatywnie można użyć django.shortcuts.redirect

+1

+1 dla widoków opartych na klasach w konfig. URL. –

+0

Zawsze zapominam o propagowaniu poglądów opartych na klasach +1 – danodonovan

+0

Dodałem to, ale dostałem błąd HTTP 500? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', permanent = False) – felix001

8

Jeśli utkniesz na Django 1.2 jak ja i RedirectView nie istnieje, inny Trasa- centralnym sposobem dodania mapowania przekierowań jest:

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

Możesz także zmienić trasę wszystkiego w meczu. Funkcja ta jest przydatna przy zmianie folderu aplikacji, ale chcąc zachować zakładki:

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

Jest to korzystne django.shortcuts.redirect jeśli tylko stara się zmodyfikować routingu url i nie mają dostępu do .htaccess , itp. (jestem na Appengine i app.yaml nie zezwala na przekierowanie adresu URL na tym poziomie jak .htaccess).

+2

Dziękuję, drugi wariant bardzo mi pomógł :) –

6

Kolejny sposób to zrobić jest użycie HttpResponsePermanentRedirect tak:

W view.py

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

W url.py

url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"), 
16

W Django 1.8, to jak ja zrobiłem mój.

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 url, można użyć pattern_name, który jest nieco un-DRY, a zapewni Ci zmienić swój adres URL, nie trzeba zmieniać zbyt przekierowanie.

+1

Podoba mi się to! Nadal działa dla Django 1.10 :) – teewuane

Powiązane problemy