web-dev-qa-db-fra.com

Python + Django page redirection

Comment puis-je effectuer une redirection simple (par exemple, cflocation dans ColdFusion ou header(location:http://) pour PHP) dans Django?

155
Kyle Hayes

C'est simple:

from Django.http import HttpResponseRedirect

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

Plus d'infos dans le official Django docs

Mise à jour: Django 1.0

Il y a 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 le documentation sur les vues génériques . 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

from Django.views.generic import RedirectView

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

En fonction de ce que vous voulez (c'est-à-dire si vous ne voulez pas faire de prétraitement supplémentaire), il est plus simple d'utiliser simplement redirect_to 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/')),
)
113
Carles Barrobés

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

ne cible peut être un appelable ainsi qu'une chaîne , c'est ce que j'utilise ici.

38
Teddy

Depuis Django 1.1, vous pouvez également utiliser le raccourci plus simple redirect :

from Django.shortcuts import redirect

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

Il faut également un argument permanent permanent = True mot-clé.

26
Kennu

Si vous voulez rediriger un sous-dossier entier, l'argument url de RedirectView est en fait interpolé , vous pouvez donc faire quelque chose comme ceci 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é, nous donnant /new_path/yay/mypath Si votre chemin d'origine était /old/yay/mypath.

Vous pouvez également faire ….as_view(url='…', query_string=True) si vous souhaitez également copier la chaîne de requête.

14
odinho - Velmont

Avec Django version 1.3, l'approche par classe est la suivante:

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 habite dans urls.py

10
Zlatko

Il faut se méfier. Je l'ai fait sur un serveur de développement et je voulais le changer plus tard.

Je devais vider mes caches pour le changer. Afin d'éviter cette grattage à l'avenir, j'ai été capable de le rendre temporaire de la manière suivante:

from Django.views.generic import RedirectView

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

chemin_page = définir dans urls.py

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

Vous pouvez le faire dans la section Admin. C'est expliqué dans la documentation.

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

1
mcneo

Cela devrait fonctionner dans la plupart des versions de Django, je l'utilise dans la 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.

0
radtek