ฉันจะเปลี่ยนเส้นทางอย่างง่าย (เช่นcflocation
ใน ColdFusion หรือheader(location:http://)
สำหรับ PHP) ใน Django ได้อย่างไร
ฉันจะเปลี่ยนเส้นทางอย่างง่าย (เช่นcflocation
ใน ColdFusion หรือheader(location:http://)
สำหรับ PHP) ใน Django ได้อย่างไร
คำตอบ:
มันง่าย:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
ข้อมูลเพิ่มเติมในเอกสารทางการของ Django
อัพเดท: Django 1.0
นอกจากนี้เห็นได้ชัดว่าวิธีที่ดีกว่าการทำเช่นนี้ใน Django generic views
ตอนนี้ใช้
ตัวอย่าง -
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
มีมากขึ้นในเอกสารมุมมองทั่วไป เครดิต - Carles Barrobés
อัปเดต # 2: Django 1.3+
ใน Django 1.5 redirect_toไม่มีอยู่แล้วและได้รับการแทนที่ด้วยRedirectView มอบเครดิตให้กับYonatan
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
redirect
จากdjango.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
ขึ้นอยู่กับสิ่งที่คุณต้องการ (เช่นถ้าคุณไม่ต้องการทำการประมวลผลล่วงหน้าเพิ่มเติม) มันง่ายกว่าที่จะใช้redirect_to
มุมมองทั่วไปของ Django :
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
ดูเอกสารประกอบสำหรับตัวอย่างขั้นสูงเพิ่มเติม
สำหรับ Django 1.3+ ให้ใช้:
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
จริงๆแล้วมีวิธีที่ง่ายกว่าการมีมุมมองสำหรับการเปลี่ยนเส้นทางแต่ละครั้งคุณสามารถทำได้โดยตรงในurls.py
:
from django.http import HttpResponsePermanentRedirect
urlpatterns = patterns(
'',
# ...normal patterns here...
(r'^bad-old-link\.php',
lambda request: HttpResponsePermanentRedirect('/nice-link')),
)
เป้าหมายสามารถเป็น callable ได้เช่นเดียวกับ stringซึ่งเป็นสิ่งที่ฉันใช้อยู่ที่นี่
redirect_to
มุมมองทั่วไปที่มาพร้อมกับ django นั้นง่ายกว่าและอ่านได้ง่ายกว่า ดู Carles ตอบstackoverflow.com/questions/523356/python-django-page-redirect/ …
ตั้งแต่ Django 1.1 คุณยังสามารถใช้ง่ายเปลี่ยนเส้นทางลัด:
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
นอกจากนี้ยังใช้การโต้แย้งคำหลักถาวร = True ไม่จำเป็น
หากคุณต้องการเปลี่ยนเส้นทางโฟลเดอร์ย่อยทั้งหมดurl
อาร์กิวเมนต์ในRedirectView จะถูกสอดแทรกดังนั้นคุณสามารถทำสิ่งนี้ใน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')),
]
จับภาพที่คุณจะได้รับการป้อนเข้า?P<path>
RedirectView
ตัวแปรบันทึกนี้ก็จะถูกแทนที่ในurl
อาร์กิวเมนต์คุณให้ให้เราถ้าเส้นทางเดิมของคุณคือ/new_path/yay/mypath
/old/yay/mypath
คุณสามารถทำได้….as_view(url='…', query_string=True)
ถ้าคุณต้องการคัดลอกสตริงแบบสอบถามด้วย
ด้วย Django เวอร์ชัน 1.3 วิธีการสอนแบบอิงคลาสคือ:
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'),
)
ตัวอย่างนี้อาศัยอยู่ในใน urls.py
ระวัง. ฉันทำสิ่งนี้บนเซิร์ฟเวอร์การพัฒนาและต้องการเปลี่ยนในภายหลัง
ฉันต้องล้างแคชเพื่อเปลี่ยน เพื่อหลีกเลี่ยงการเกาหัวในอนาคตฉันสามารถทำให้มันชั่วคราวเช่น:
from django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
คุณสามารถทำได้ในส่วนผู้ดูแลระบบ มันอธิบายไว้ในเอกสาร
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
page_path = define เป็น urls.py
def deletePolls(request):
pollId = deletePool(request.GET['id'])
return HttpResponseRedirect("/page_path/")
ควรใช้กับ django เวอร์ชันส่วนใหญ่ฉันใช้ใน 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'),
....
)
คุณยังคงสามารถใช้ชื่อของรูปแบบ URL แทน URL แบบตายตัวด้วยโซลูชันนี้ พารามิเตอร์ location_id จาก url ถูกส่งผ่านไปยังฟังก์ชัน lambda