Arahan ulang halaman Python + Django


158

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

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

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

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.


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.


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.


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


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


1

page_path = define di urls.py

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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.