Comment effectuer une simple redirection (par exemple cflocation
dans ColdFusion ou header(location:http://)
pour PHP) dans Django?
Comment effectuer une simple redirection (par exemple cflocation
dans ColdFusion ou header(location:http://)
pour PHP) dans Django?
Réponses:
C'est simple:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
Plus d'informations dans la documentation officielle de Django
Mise à jour: Django 1.0
Il existe apparemment une meilleure façon de faire cela dans Django en utilisant maintenant generic views
.
Exemple -
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Il y a plus dans la documentation des vues génériques . Crédit - Carles Barrobés .
Mise à jour n ° 2: Django 1.3+
Dans Django 1.5, redirect_to n'existe plus et a été remplacé par RedirectView . Crédit à Yonatan
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
redirect
de django.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
En fonction de ce que vous voulez (c'est-à-dire si vous ne souhaitez pas faire de prétraitement supplémentaire), il est plus simple d'utiliser simplement la redirect_to
vue générique de Django :
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Consultez la documentation pour des exemples plus avancés.
Pour Django 1.3+, utilisez:
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
Il existe en fait un moyen plus simple que d'avoir une vue pour chaque redirection - vous pouvez le faire directement dans urls.py
:
from django.http import HttpResponsePermanentRedirect
urlpatterns = patterns(
'',
# ...normal patterns here...
(r'^bad-old-link\.php',
lambda request: HttpResponsePermanentRedirect('/nice-link')),
)
Une cible peut être un appelable aussi bien qu'une chaîne , ce que j'utilise ici.
redirect_to
vue générique fournie avec django est encore plus simple et plus lisible. Voir la réponse de Carles stackoverflow.com/questions/523356/python-django-page-redirect/...
Depuis Django 1.1, vous pouvez également utiliser le raccourci de redirection plus simple :
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
Il prend également un argument de mot clé permanent = True facultatif.
Si vous souhaitez rediriger un sous-dossier entier, l' url
argument de RedirectView est en fait interpolé , vous pouvez donc faire quelque chose comme ça dans 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')),
]
Le que ?P<path>
vous capturez sera alimenté RedirectView
. Cette variable capturée sera ensuite remplacée dans l' url
argument que vous avez donné, nous indiquant /new_path/yay/mypath
si votre chemin d'origine l'était /old/yay/mypath
.
Vous pouvez également le faire ….as_view(url='…', query_string=True)
si vous souhaitez également copier la chaîne de requête.
Avec Django version 1.3, l'approche basée sur les classes est:
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'),
)
Cet exemple se trouve dans urls.py
Il faut se méfier. J'ai fait cela sur un serveur de développement et je voulais le changer plus tard.
J'ai dû vider mes caches pour le changer. Afin d'éviter ce grattage à la tête à l'avenir, j'ai pu le rendre temporaire comme ceci:
from django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
Vous pouvez le faire dans la section Admin. C'est expliqué dans la documentation.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
Cela devrait fonctionner dans la plupart des versions de django, je l'utilise dans la version 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'),
....
)
Vous pouvez toujours utiliser le nom du modèle d'URL au lieu d'une URL codée en dur avec cette solution. Le paramètre location_id de l'url est transmis à la fonction lambda.