it-swarm.com.de

Python + Django Seitenumleitung

Wie kann ich eine einfache Weiterleitung (z. B. cflocation in ColdFusion oder header(location:http://) für PHP) in Django durchführen?

155
Kyle Hayes

Es ist einfach:

from Django.http import HttpResponseRedirect

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

Mehr Infos in den offiziellen Django docs

Update: Django 1.0

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

Beispiel -

from Django.views.generic.simple import redirect_to

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

    #etc...
)

Es gibt mehr in der generische Ansichten Dokumentation . Kredit - Carles Barrobés .

Update 2: Django 1.3 +

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

from Django.views.generic import RedirectView

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

Je nachdem, was Sie möchten (d. H. Wenn Sie keine zusätzliche Vorverarbeitung durchführen möchten), ist es einfacher, einfach die generische Ansicht von Django redirect_to Zu verwenden:

from Django.views.generic.simple import redirect_to

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

    #etc...
)

Weitere Beispiele finden Sie in Dokumentation .


Für Django 1.3+ verwenden Sie:

from Django.views.generic import RedirectView

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

Es gibt tatsächlich eine einfachere Möglichkeit, als für jede Weiterleitung eine Ansicht zu haben - Sie können dies direkt in urls.py Tun:

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 benutze.

38
Teddy

Seit Django 1.1) können Sie auch die einfachere Verknüpfung Weiterleiten verwenden:

from Django.shortcuts import redirect

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

Es kann auch ein optionales permanent = True-Schlüsselwortargument verwendet werden.

26
Kennu

Wenn Sie einen ganzen Unterordner umleiten möchten, verwenden Sie das Argument url in RedirectView wird tatsächlich interpoliert , damit Sie in urls.py So etwas tun können:

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 erfasste ?P<path> Wird in RedirectView eingegeben. Diese erfasste Variable wird dann in dem von Ihnen angegebenen Argument url ersetzt und gibt uns /new_path/yay/mypath, Wenn Ihr ursprünglicher Pfad /old/yay/mypath War.

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

14

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

10
Zlatko

In acht nehmen. Ich habe das 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 temporär so machen:

from Django.views.generic import RedirectView

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

page_path = definiere in urls.py

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

Sie können dies im Admin-Bereich tun. Es ist in der Dokumentation erklärt.

https://docs.djangoproject.com/en/dev/ref/contrib/redirects/

1
mcneo

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

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

0
radtek