Bagaimana cara menyelesaikan redirect sederhana (misalnya cflocation
dalam ColdFusion, atau header(location:http://)
untuk PHP) di Django?
Bagaimana cara menyelesaikan redirect sederhana (misalnya cflocation
dalam ColdFusion, atau header(location:http://)
untuk PHP) di Django?
Jawaban:
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/')),
)
redirect
dari django.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
Bergantung pada apa yang Anda inginkan (yaitu jika Anda tidak ingin melakukan pra-pemrosesan tambahan), lebih mudah untuk hanya menggunakan redirect_to
tampilan 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/')),
)
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.
redirect_to
umum yang datang dengan Django masih lebih sederhana dan lebih mudah dibaca. Lihat Carles jawab stackoverflow.com/questions/523356/python-django-page-redirect/…
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.
Jika Anda ingin mengarahkan seluruh subfolder, url
argumen 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 url
argumen yang Anda berikan, memberi kami /new_path/yay/mypath
jika jalur awal Anda /old/yay/mypath
.
Anda juga dapat melakukannya ….as_view(url='…', query_string=True)
jika Anda ingin menyalin string kueri juga.
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
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/')),
Anda dapat melakukan ini di bagian Admin. Itu dijelaskan dalam dokumentasi.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
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.