Python + reindirizzamento della pagina Django


158

Come posso realizzare un semplice reindirizzamento (ad es. cflocationIn ColdFusion o header(location:http://)per PHP) in Django?

Risposte:


250

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

8
Questo non è più il metodo migliore a partire da Django 1.0. Vedi questa risposta: stackoverflow.com/questions/523356/python-django-page-redirect/…
Jake

2
Perché non usare redirectda django.shortcuts?
Afshin Mehrabani,

4
Io uso('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey il

5
Questo è già obsoleto a partire da Django 1.5. Utilizza invece "RedirectView": docs.djangoproject.com/en/1.5/ref/class-based-views/base/…
Yonatan

In realtà non è deprecato, cosa stai dicendo è deprecato? reindirizzare ? Utilizzando questo metodo non so come passare il valore dei parametri a lambda, ovvero url (r '^ (? P <location_id> \ d +) / $', lambda x: HttpResponseRedirect (reverse ('dailyreport_location', args = ['% (location_id)',]))) non funziona
radtek,

113

A seconda di ciò che si desidera (ovvero se non si desidera eseguire alcuna pre-elaborazione aggiuntiva), è più semplice utilizzare la redirect_tovisualizzazione 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/')),
)

+1 per l'utilizzo di una vista generica anziché per l'implementazione della propria (non importa quanto semplice) come nella (attuale) risposta più votata.
Giorno

Qualcuno ha qualche esempi per se non vuole fare ulteriore pre-elaborazione?
Egeranalyst

1
Quindi suggerirei di scrivere una vista personalizzata che esegua l'elaborazione e quindi chiamare la vista generica, oppure scrivere un decoratore ad esempio pre_process e decorare la vista generica: (r '^ one / $', pre_process (redirect_to), {'url ':' / another / '})
Carles Barrobés il

1
@niallsco: se vuoi eseguire ulteriori elaborazioni, allora è meglio usare il collegamento di reindirizzamento come descritto da Kennu qui
Lie Ryan,

1
In django 1.4, l'importazione di redirect_to genera un avviso di deprivazione.
Giovedì

38

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.


2
È vero, ma l'utilizzo della redirect_tovista generica fornita con django è ancora più semplice e leggibile. Vedi la risposta di Carles stackoverflow.com/questions/523356/python-django-page-redirect/…
Giorno

28

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.


14

Se vuoi reindirizzare un'intera sottocartella, l' urlargomento 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 urlnell'argomento che hai fornito, dandoci /new_path/yay/mypathse 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.


10

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


6

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


1

page_path = define in urls.py

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

0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.