Python + Django page redirect
comment effectuer une simple redirection (par exemple cflocation
dans ColdFusion, ou header(location:http://)
pour PHP) dans Django?
10 réponses
c'est simple:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
plus d'informations dans le official Django docs
Mise À Jour: Django 1.0
il y a apparemment une meilleure façon de le faire à 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 generic views documentation . Crédit - Carles Barrobés .
Mise À Jour #2: Django 1.3+
Dans Django 1.5 redirect_to n'existe plus et a été remplacé par RedirectView . Crédit à Yonatan "151980920
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
selon ce que vous voulez (c.-à-d. Si vous ne voulez pas faire de pré-traitement supplémentaire), il est plus simple d'utiliser simplement le redirect_to
de Django vue générique:
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
voir documentation pour des exemples plus avancés.
Pour Django 1.3+ utilisation:
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
il y a 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 callable ainsi qu'une chaîne de caractères , ce que j'utilise ici.
si vous voulez rediriger un sous-dossier entier, l'argument url
dans RedirectView est en fait interpolé , donc vous pouvez 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 ?P<path>
que vous capturez sera introduit dans RedirectView
. Cette variable capturée sera alors remplacée dans l'argument url
que vous avez donné, en nous donnant /new_path/yay/mypath
si votre chemin original était /old/yay/mypath
.
, Vous pouvez aussi le faire ….as_view(url='…', query_string=True)
si vous voulez copier la chaîne de requête.
avec Django version 1.3, l'approche par classe 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 réside à à urls.py
attention. Je l'ai fait sur un serveur de développement et je voulais le changer plus tard.
j'ai dû nettoyer mes caches pour le changer. Afin d'éviter cette égratignure dans le futur, j'ai pu la rendre temporaire comme cela:
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 /
page_path = définir dans urls.py
def deletePolls(request):
pollId = deletePool(request.GET['id'])
return HttpResponseRedirect("/page_path/")
Cela devrait fonctionner dans la plupart des versions de django, je l'utilise en 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 dur avec cette solution. Le paramètre location_id de l'url est transmis à la fonction lambda.