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.