Django URL Redirect

101

Wie kann ich Datenverkehr, der keiner meiner anderen URLs entspricht, zurück zur Startseite umleiten?

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

So wie es aussieht, sendet der letzte Eintrag den gesamten "anderen" Verkehr an die Homepage, aber ich möchte entweder über HTTP 301 oder 302 umleiten .

felix001
quelle

Antworten:

181

Sie können die aufgerufene klassenbasierte Ansicht ausprobieren 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 wie urlin der<url_to_home_view> Sie die URL tatsächlich angeben müssen.

permanent=Falsegibt HTTP 302 zurück, während permanent=TrueHTTP 301 zurückgegeben wird.

Alternativ können Sie verwenden django.shortcuts.redirect

Update für Django 2+ Versionen

Mit Django 2+ url()wird veraltet und ersetzt durch re_path(). Die Verwendung ist genau die gleiche wie url()bei regulären Ausdrücken. Verwenden Sie für Ersetzungen ohne regulären Ausdruck path().

from django.urls import re_path

re_path(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
dmg
quelle
Ich habe dies hinzugefügt, aber gerade einen HTTP 500-Fehler erhalten. url (r '^. * $', RedirectView.as_view (url = 'macmon_about', permanent = False)
felix001
1
Sie scheinen ein ")" zu vermissen, seitliches Scrollen bis zum Ende und Sie werden es sehen. Sie können den nameTeil jedoch weglassen
dmg
1
@ felix001 Übrigens bedeutet HTTP 500 normalerweise (wie in 99% der Fälle), dass Sie einen Syntaxfehler haben. Sehen Sie sich dies an - docs.djangoproject.com/de/dev/howto/error-reporting/… . Wenn eine Website in der Entwicklung ist , ist es immer gut zu haben DEBUG = Trueoder zumindest die eingestellte ADMINSOption - docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
dmg
Wie geht das? Ich übergebe Slug und verwende dieses Feld, um eine Umleitungs-URL zu erstellen. EXA: URL (r '^ (? P <Slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (URL = 'http: //'+slug+'.mywebsite.com', permanent = Falsch),)
Roshan
Beachten Sie, dass es mit dieser Methode sehr einfach ist, den Benutzer in eine Umleitungsschleife zu verwickeln.
Smilebomb
35

In Django 1.8 habe ich meine so gemacht.

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

Anstatt zu verwenden url, können Sie die verwenden pattern_name, die etwas ungetrocknet ist und sicherstellt, dass Sie Ihre URL ändern. Sie müssen auch die Umleitung nicht ändern.

KhoPhi
quelle
11

Wenn Sie wie ich auf Django 1.2 stecken bleiben und RedirectView nicht existiert, verwenden Sie eine andere routenzentrierte Methode zum Hinzufügen des Redirect-Mappings:

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

Sie können auch alles in einem Match umleiten. Dies ist nützlich, wenn Sie den Ordner einer App ändern, aber Lesezeichen beibehalten möchten:

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

Dies ist django.shortcuts.redirect vorzuziehen, wenn Sie nur versuchen, Ihr URL-Routing zu ändern und keinen Zugriff auf .htaccess usw. haben (ich bin auf Appengine und app.yaml erlaubt keine URL-Umleitung auf dieser Ebene wie eine .htaccess).

Blaine Garrett
quelle
3
Dieses alte Format ist in neuen Versionen von Django veraltet oder entfernt. Sie können jedoch weiterhin URL-Schlüsselwörter verwenden, wenn Sie mit RedirectView umleiten, wie in der akzeptierten Antwort beschrieben. Beispiel:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter
9

Eine andere Möglichkeit ist die Verwendung von HttpResponsePermanentRedirect wie folgt:

In view.py

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

In der url.py

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

Die anderen Methoden funktionieren gut, aber Sie können auch die guten alten verwenden django.shortcut.redirect.

Der folgende Code wurde dieser Antwort entnommen .

In 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')),
]
Bomben
quelle