Python + Django pagina di reindirizzamento
Domanda
Come faccio a compiere un semplice reindirizzamento (ad esempio cflocation
in ColdFusion, o header(location:http://)
per PHP) in Django?
Soluzione
E 'semplice:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
Più informazioni nel documentazione ufficiale Django
Aggiornamento: Django 1.0
C'è evidentemente un modo migliore di fare questo in Django ora utilizzando generic views
.
Esempio -
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Non c'è più nel vista generico documentazione . Credito -. Carles Barrobés
Aggiornamento # 2: Django 1.3 +
In Django 1.5 redirect_to non esiste più ed è stato sostituito da RedirectView . Credito al Yonatan
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
Altri suggerimenti
A seconda di ciò che si vuole (vale a dire se non si vuole fare qualsiasi ulteriore pre-processing), è più semplice utilizzare solo redirect_to
vista generico di Django:
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
documentazione per gli esempi più avanzati.
Per uso Django 1.3+:
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
In realtà c'è un modo più semplice che avere una visione per ogni reindirizzamento - si può fare direttamente in urls.py
:
from django.http import HttpResponsePermanentRedirect
urlpatterns = patterns(
'',
# ...normal patterns here...
(r'^bad-old-link\.php',
lambda request: HttpResponsePermanentRedirect('/nice-link')),
)
Un obiettivo può essere un callable così come una stringa , che è quello che sto usando qui.
Dal Django 1.1, è possibile utilizzare anche il più semplice reindirizzamento scorciatoia:
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
: Ci vuole anche un argomento chiave = true permanente opzionale.
Se si desidera reindirizzare un intero sottocartella, l'argomento url
in RedirectView è in realtà interpolato , in modo da poter fare qualcosa di simile in 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')),
]
Il ?P<path>
catturare verrà immessa nella RedirectView
. Questa variabile catturato sarà poi sostituito nella discussione url
hai dato, dandoci /new_path/yay/mypath
se il percorso originale era /old/yay/mypath
.
È anche possibile fare ….as_view(url='…', query_string=True)
se si desidera copiare la stringa di query sopra pure.
Con Django versione 1.3, l'approccio basato classe è:
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'),
)
In questo esempio vive in in urls.py
Attenzione. Ho fatto questo su un server di sviluppo e volevo cambiare in un secondo momento.
Ho dovuto cancellare la mia cache di cambiarlo. Al fine di evitare questo testa-graffio in futuro, sono stato in grado di farlo temporanea in questo modo:
from django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
È possibile farlo nella sezione Amministrazione. E 'spiegato nella documentazione.
https://docs.djangoproject.com/en/dev/ref / contrib / reindirizza /
page_path = definire in urls.py
def deletePolls(request):
pollId = deletePool(request.GET['id'])
return HttpResponseRedirect("/page_path/")
Questo dovrebbe funzionare nella maggior parte delle versioni di Django, Io lo utilizzo 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'),
....
)
È comunque possibile utilizzare il nome del modello URL invece di un URL hard coded con questa soluzione. Il parametro location_id dall'URL è tramandata alla funzione lambda.