Python + Django page redirect

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

150
demandé sur Kyle Hayes 2009-02-07 10:08:03

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/')),
)
240
répondu Baishampayan Ghose 2017-05-23 11:55:09

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/')),
)
112
répondu Carles Barrobés 2016-07-08 15:22:15

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.

38
répondu Teddy 2010-01-17 08:07:32

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

from django.shortcuts import redirect

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

il prend aussi un argument optionnel permanent=True keyword.

25
répondu Kennu 2010-09-05 11:09:03

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.

12
répondu odinho - Velmont 2017-11-01 08:39:54

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

10
répondu Zlatko 2011-09-14 12:55:33

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/')),
6
répondu Gringo Suave 2017-05-23 11:55:09

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

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

1
répondu mcneo 2012-02-20 21:19:33

page_path = définir dans urls.py

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")
1
répondu Moddasir Khan 2013-07-12 12:45:36

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.

0
répondu radtek 2014-06-12 18:23:52