Wie führe ich eine einfache Weiterleitung (z. B. cflocation
in ColdFusion oder header(location:http://)
für PHP) in Django durch?
Wie führe ich eine einfache Weiterleitung (z. B. cflocation
in ColdFusion oder header(location:http://)
für PHP) in Django durch?
Antworten:
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/')),
)
redirect
von django.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
Je nachdem, was Sie möchten (dh wenn Sie keine zusätzliche Vorverarbeitung durchführen möchten), ist es einfacher, nur die redirect_to
generische 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/')),
)
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.
redirect_to
generischen Ansicht, die mit Django geliefert wird, ist noch einfacher und besser lesbar. Siehe Carles Antwort stackoverflow.com/questions/523356/python-django-page-redirect/…
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.
Wenn Sie einen ganzen Unterordner umleiten möchten, wird das url
Argument 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 url
Ihnen angegebenen Argument ersetzt und gibt uns an, /new_path/yay/mypath
ob 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.
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
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/')),
Sie können dies im Admin-Bereich tun. Es wird in der Dokumentation erklärt.
https://docs.djangoproject.com/de/dev/ref/contrib/redirects/
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.