Come posso realizzare un semplice reindirizzamento (ad es. cflocation
In ColdFusion o header(location:http://)
per PHP) in Django?
Come posso realizzare un semplice reindirizzamento (ad es. cflocation
In ColdFusion o header(location:http://)
per PHP) in Django?
Risposte:
È semplice:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
Maggiori informazioni nei documenti ufficiali di Django
Aggiornamento: Django 1.0
Apparentemente c'è un modo migliore per farlo in Django ora usando generic views
.
Esempio -
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
C'è di più nella documentazione delle viste generiche . Credito - Carles Barrobés .
Aggiornamento n. 2: Django 1.3+
In Django 1.5 redirect_to non esiste più ed è stato sostituito da RedirectView . Ringraziamo Yonatan
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
redirect
da django.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
A seconda di ciò che si desidera (ovvero se non si desidera eseguire alcuna pre-elaborazione aggiuntiva), è più semplice utilizzare la redirect_to
visualizzazione generica di Django :
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Vedere la documentazione per esempi più avanzati.
Per Django 1.3+ utilizzare:
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
Esiste in realtà un modo più semplice di avere una vista per ogni reindirizzamento: puoi farlo 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 target può essere un callable e una stringa , che è quello che sto usando qui.
redirect_to
vista generica fornita con django è ancora più semplice e leggibile. Vedi la risposta di Carles stackoverflow.com/questions/523356/python-django-page-redirect/…
Da Django 1.1, puoi anche utilizzare il collegamento di reindirizzamento più semplice :
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
Accetta anche un argomento facoltativo permanente = Vero parola chiave.
Se vuoi reindirizzare un'intera sottocartella, l' url
argomento in RedirectView è effettivamente interpolato , quindi puoi fare qualcosa del genere 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')),
]
La ?P<path>
tua cattura verrà alimentata RedirectView
. Questa variabile acquisita verrà quindi sostituita url
nell'argomento che hai fornito, dandoci /new_path/yay/mypath
se fosse il tuo percorso originale /old/yay/mypath
.
Puoi anche farlo ….as_view(url='…', query_string=True)
se desideri copiare anche la stringa di query.
Con Django versione 1.3, l'approccio basato sulla 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'),
)
Questo esempio vive in urls.py
Attenzione. L'ho fatto su un server di sviluppo e volevo modificarlo in seguito.
Ho dovuto svuotare la cache per cambiarlo. Per evitare questo grattarsi la testa in futuro, sono stato in grado di renderlo temporaneo in questo modo:
from django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
Puoi farlo nella sezione Amministratore. È spiegato nella documentazione.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
Questo dovrebbe funzionare nella maggior parte delle versioni di Django, lo sto usando 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'),
....
)
Con questa soluzione puoi comunque utilizzare il nome del pattern url anziché un URL hard coded. Il parametro location_id dall'URL viene passato alla funzione lambda.