2013-02-19 9 views
76

Wie kann ich Traffic umleiten, der nicht mit meinen anderen URLs übereinstimmt, zurück zur Startseite? Mein urls.py aussieht,Django URL Redirect

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

Da es der letzte Eintrag steht sendet alle „anderen“ Traffic auf der Homepage, aber ich möchte entweder über eine HTTP 301 oder 302

Dank umleiten,

Antwort

131

Sie können die Klasse Based Ansicht versuchen genannt 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') 
) 

Beachten Sie, wie als url im <url_to_home_view> müssen Sie die URL tatsächlich angeben.

permanent=False kehrt HTTP 302, während permanent=True HTTP 301.

zurückkehren Alternativ können Sie django.shortcuts.redirect

+1

+1 für klassenbasierte Ansichten in der URL-Konf. –

+0

Ich vergesse immer zu befürworten Klassenbasierte Ansichten +1 – danodonovan

+0

Ich habe dies hinzugefügt, aber nur einen HTTP 500 Fehler? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', permanent = Falsch) – felix001

8

verwenden Wenn Sie auf django stecken 1.2 wie ich bin und RedirectView nicht existiert, eine andere Routen- centric Weg zum Hinzufügen der Umleitung Zuordnung verwendet:

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

Sie können auch alles um eine Übereinstimmung umleiten. Dies ist nützlich, wenn Sie den Ordner einer App zu ändern, sondern wollen Lesezeichen erhalten:

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

Dies ist vorzuziehen zu django.shortcuts.redirect, wenn Sie versuchen, Ihre URL-Routing zu ändern und haben keinen Zugang zu .htaccess usw. (Ich bin auf Appengine und app.yaml erlaubt keine URL-Umleitung auf dieser Ebene wie ein .htaccess).

+2

Vielen Dank, zweite Variante hat mir sehr geholfen :) –

6

Eine andere Möglichkeit, es zu tun ist mit HttpResponsePermanentRedirect wie so:

In view.py

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

Im url.py

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

In Django 1.8 ist dies, wie ich hat meins.

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

Statt url zu verwenden, können Sie die pattern_name verwenden, die ein wenig un-DRY ist, und wird sicherstellen, dass Sie Ihre URL ändern, müssen Sie sich nicht zu der Umleitung ändern.

+1

Ich mag das! Funktioniert immer noch für Django 1.10 :) – teewuane