Python + Django-Seitenumleitung


158

Wie führe ich eine einfache Weiterleitung (z. B. cflocationin ColdFusion oder header(location:http://)für PHP) in Django durch?

Antworten:


250

Es ist einfach:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")

Weitere Informationen in den offiziellen Django-Dokumenten

Update: Django 1.0

Es gibt anscheinend einen besseren Weg, dies in Django jetzt zu tun generic views.

Beispiel -

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',   
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

Weitere Informationen finden Sie in der Dokumentation zu allgemeinen Ansichten . Kredit - Carles Barrobés .

Update Nr. 2: Django 1.3+

In Django 1.5 existiert redirect_to nicht mehr und wurde durch RedirectView ersetzt . Gutschrift an Yonatan

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

8
Dies ist ab Django 1.0 nicht mehr die beste Methode. Siehe diese Antwort: stackoverflow.com/questions/523356/python-django-page-redirect/…
Jake

2
Warum nicht redirectvon django.shortcuts?
Afshin Mehrabani

4
Ich benutze('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey

5
Dies ist ab Django 1.5 bereits veraltet. Verwenden Sie stattdessen 'RedirectView': docs.djangoproject.com/de/1.5/ref/class-based-views/base/…
Yonatan

Es ist eigentlich nicht veraltet, was sagen Sie, ist veraltet? umleiten? Mit dieser Methode weiß ich nicht, wie ich den Wert von Parametern an Lambda übergeben soll, dh URL (r '^ (? P <Location_ID> \ d +) / $', Lambda x: HttpResponseRedirect (reverse ('dailyreport_location', args =) ['% (location_id)',]))) funktioniert nicht
radtek

113

Je nachdem, was Sie möchten (dh wenn Sie keine zusätzliche Vorverarbeitung durchführen möchten), ist es einfacher, nur die redirect_togenerische Ansicht von Django zu verwenden :

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

Weitere Beispiele finden Sie in der Dokumentation .


Für Django 1.3+ verwenden Sie:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

+1 für die Verwendung einer generischen Ansicht, anstatt Ihre eigene (egal wie einfach) zu implementieren, wie in der (aktuellen) Antwort mit der höchsten Abstimmung.
Tag

Hat jemand irgendwelche Beispiele für , wenn Sie es möchten zusätzliche Vorverarbeitung tun?
Eifersüchtiger

1
Dann würde ich vorschlagen, entweder eine benutzerdefinierte Ansicht zu schreiben, die die Verarbeitung ausführt und dann die generische Ansicht aufruft, oder einen Dekorator zu schreiben, z. B. pre_process, und die generische Ansicht zu dekorieren: (r '^ one / $', pre_process (redirect_to), {'url ':' / another / '})
Carles Barrobés

1
@niallsco: Wenn Sie zusätzliche Verarbeitung durchführen möchten, verwenden Sie am besten die von Kennu hier
Lie Ryan

1
In Django 1.4 gibt der Import von redirect_to eine Depracation-Warnung aus.
Joctee

38

Es gibt tatsächlich einen einfacheren Weg als eine Ansicht für jede Umleitung - Sie können dies direkt tun in urls.py:

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)

Ein Ziel kann sowohl ein aufrufbarer als auch ein String sein , was ich hier verwende.


2
Stimmt, aber die Verwendung der redirect_togenerischen Ansicht, die mit Django geliefert wird, ist noch einfacher und besser lesbar. Siehe Carles Antwort stackoverflow.com/questions/523356/python-django-page-redirect/…
Tag

28

Seit Django 1.1 können Sie auch die einfachere Umleitungsverknüpfung verwenden :

from django.shortcuts import redirect

def myview(request):
    return redirect('/path')

Es ist auch ein optionales permanent = True-Schlüsselwortargument erforderlich.


14

Wenn Sie einen ganzen Unterordner umleiten möchten, wird das urlArgument in RedirectView tatsächlich interpoliert , sodass Sie Folgendes tun können urls.py:

from django.conf.urls.defaults import url
from django.views.generic import RedirectView

urlpatterns = [
    url(r'^old/(?P<path>.*)$', RedirectView.as_view(url='/new_path/%(path)s')),
]

Das, was ?P<path>Sie erfassen, wird eingespeist RedirectView. Diese erfasste Variable wird dann in dem von urlIhnen angegebenen Argument ersetzt und gibt uns an, /new_path/yay/mypathob Ihr ursprünglicher Pfad war /old/yay/mypath.

Sie können dies auch tun, ….as_view(url='…', query_string=True)wenn Sie die Abfragezeichenfolge ebenfalls kopieren möchten.


10

Mit Django Version 1.3 lautet der klassenbasierte Ansatz:

from django.conf.urls.defaults import patterns, url
from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-url/$', RedirectView.as_view(url='/redirect-url/'), name='some_redirect'),
)

Dieses Beispiel befindet sich in urls.py


6

In acht nehmen. Ich habe dies auf einem Entwicklungsserver gemacht und wollte es später ändern.

Ich musste meine Caches leeren, um es zu ändern. Um dieses Kopfkratzen in Zukunft zu vermeiden, konnte ich es vorübergehend so machen:

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),


1

page_path = in urls.py definieren

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")

0

Dies sollte in den meisten Versionen von Django funktionieren, ich verwende es in 1.6.5:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
urlpatterns = patterns('',
    ....
    url(r'^(?P<location_id>\d+)/$', lambda x, location_id: HttpResponseRedirect(reverse('dailyreport_location', args=[location_id])), name='location_stats_redirect'),
    ....
)

Mit dieser Lösung können Sie weiterhin den Namen des URL-Musters anstelle einer fest codierten URL verwenden. Der Parameter location_id aus der URL wird an die Lambda-Funktion übergeben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.