Arahan ulang halaman Python + Django

158

Bagaimana cara menyelesaikan redirect sederhana (misalnya cflocationdalam ColdFusion, atau header(location:http://)untuk PHP) di Django?

Kyle Hayes
sumber

Jawaban:

250

Itu mudah:

from django.http import HttpResponseRedirect

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

Info lebih lanjut di dokumen resmi Django

Pembaruan: Django 1.0

Tampaknya ada cara yang lebih baik untuk melakukan ini di Django sekarang menggunakan generic views.

Contoh -

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',   
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

Ada lebih banyak dalam dokumentasi pandangan umum . Kredit - Carles Barrobés .

Pembaruan # 2: Django 1.3+

Di Django 1.5 redirect_to tidak ada lagi dan telah digantikan oleh RedirectView . Penghargaan untuk Yonatan

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)
Baishampayan Ghose
sumber
8
Ini bukan lagi metode terbaik untuk Django 1.0. Lihat jawaban ini: stackoverflow.com/questions/523356/python-django-page-redirect/…
Jake
2
Mengapa tidak menggunakan redirectdari django.shortcuts?
Afshin Mehrabani
4
Saya menggunakan('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey
5
Ini sudah usang mulai di Django 1.5. Gunakan 'RedirectView' sebagai gantinya: docs.djangoproject.com/en/1.5/ref/class-based-views/base/…
Yonatan
Ini sebenarnya tidak usang, apa yang Anda katakan sudah usang? redirect? Dengan menggunakan metode ini saya tidak tahu bagaimana meneruskan nilai parameter ke lambda, yaitu url (r '^ (? P <location_id> \ d +) / $', lambda x: HttpResponseRedirect (membalikkan ('dailyreport_location', args = ['% (location_id)',])))) tidak berfungsi
radtek
113

Bergantung pada apa yang Anda inginkan (yaitu jika Anda tidak ingin melakukan pra-pemrosesan tambahan), lebih mudah untuk hanya menggunakan redirect_totampilan umum Django :

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

Lihat dokumentasi untuk contoh lebih lanjut.


Untuk Django 1.3+ gunakan:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)
Carles Barrobés
sumber
Memberi +1 untuk menggunakan tampilan umum daripada menerapkan milik Anda sendiri (tidak peduli sesederhana apa pun) seperti pada jawaban terpilih (saat ini).
Hari
Apakah ada yang punya contoh karena jika Anda tidak ingin melakukan tambahan pra-pengolahan?
eageranalyst
1
Lalu saya sarankan untuk menulis tampilan kustom yang melakukan pemrosesan dan kemudian memanggil tampilan generik, atau menulis dekorator misalnya pre_process dan menghias tampilan generik: (r '^ one / $', pre_process (redirect_to), {'url ':' / another / '})
Carles Barrobés
1
@niallsco: jika Anda ingin melakukan pemrosesan tambahan, maka yang terbaik adalah menggunakan pintasan pengalihan seperti yang dijelaskan oleh Kennu di sini
Lie Ryan
1
Dalam Django 1.4, mengimpor redirect_to memberikan peringatan depracation.
Joctee
38

Sebenarnya ada cara yang lebih sederhana daripada memiliki tampilan untuk setiap pengalihan - Anda dapat melakukannya secara langsung di urls.py:

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)

Target dapat berupa callable dan juga string , yang saya gunakan di sini.

Teddy
sumber
2
Benar, tetapi menggunakan tampilan redirect_toumum yang datang dengan Django masih lebih sederhana dan lebih mudah dibaca. Lihat Carles jawab stackoverflow.com/questions/523356/python-django-page-redirect/…
Hari
28

Sejak Django 1.1, Anda juga dapat menggunakan pintasan pengalihan yang lebih sederhana :

from django.shortcuts import redirect

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

Itu juga membutuhkan argumen permanen = true keyword opsional.

Kennu
sumber
14

Jika Anda ingin mengarahkan seluruh subfolder, urlargumen di RedirectView sebenarnya diinterpolasi , sehingga Anda dapat melakukan sesuatu seperti ini di 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')),
]

Hasil ?P<path>tangkapan Anda akan dimasukkan RedirectView. Variabel yang diambil ini kemudian akan diganti dalam urlargumen yang Anda berikan, memberi kami /new_path/yay/mypathjika jalur awal Anda /old/yay/mypath.

Anda juga dapat melakukannya ….as_view(url='…', query_string=True)jika Anda ingin menyalin string kueri juga.

odinho - Velmont
sumber
10

Dengan Django versi 1.3, pendekatan berbasis kelas adalah:

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

Contoh ini hidup di dalam urls.py

Zlatko
sumber
6

Awas. Saya melakukan ini pada server pengembangan dan ingin mengubahnya nanti.

Saya harus menghapus cache untuk mengubahnya. Untuk menghindari goresan kepala ini di masa depan, saya bisa membuatnya sementara seperti:

from django.views.generic import RedirectView

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

page_path = define di urls.py

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

Ini seharusnya bekerja di sebagian besar versi Django, saya menggunakannya di 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'),
    ....
)

Anda masih dapat menggunakan nama pola url alih-alih url kode keras dengan solusi ini. Parameter location_id dari url diturunkan ke fungsi lambda.

radtek
sumber