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.