Python + Django เปลี่ยนเส้นทางหน้า


คำตอบ:


250

มันง่าย:

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

8
นี่ไม่ใช่วิธีที่ดีที่สุดของ Django 1.0 อีกต่อไป ดูคำตอบนี้: stackoverflow.com/questions/523356/python-django-page-redirect/ …
Jake

2
ทำไมไม่ได้ใช้redirectจากdjango.shortcuts?
Afshin Mehrabani

4
ฉันใช้('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey

5
นี่เลิกใช้แล้วที่เริ่มต้นใน Django 1.5 ใช้ 'RedirectView' แทน: docs.djangoproject.com/en/1.5/ref/class-based-views/base/…
Yonatan

จริง ๆ แล้วมันไม่คัดค้านคุณจะพูดว่าเลิกใช้อย่างไร เปลี่ยนเส้นทางหรือไม่ การใช้วิธีนี้ฉันไม่รู้วิธีส่งค่าพารามิเตอร์ไปยัง lambda เช่น url (r '^ (? P <location_id> \ d +) / $', lambda x: HttpResponseRedirect (reverse ('dailyreport_location', args =) ['% (location_id)',]))) ใช้งานไม่ได้
radtek

113

ขึ้นอยู่กับสิ่งที่คุณต้องการ (เช่นถ้าคุณไม่ต้องการทำการประมวลผลล่วงหน้าเพิ่มเติม) มันง่ายกว่าที่จะใช้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/')),
)

+1 สำหรับการใช้มุมมองทั่วไปมากกว่าการนำไปใช้ของคุณเอง (ไม่ว่าจะง่ายขนาดไหน) ในคำตอบที่ได้รับการโหวตสูงสุด (ปัจจุบัน)
วันที่

ไม่มีใครมีตัวอย่างใด ๆ ถ้าคุณไม่ต้องการที่จะทำก่อนการประมวลผลเพิ่มเติม?
eageranalyst

1
จากนั้นฉันขอแนะนำให้เขียนมุมมองที่กำหนดเองที่ใช้ในการประมวลผลแล้วเรียกใช้มุมมองทั่วไปหรือเขียนมัณฑนากรเช่น pre_process และตกแต่งมุมมองทั่วไป: (r '^ one / $', pre_process (redirect_to), {'url ':' / another / '})
Carles Barrobés

1
@niallsco: หากคุณต้องการทำการประมวลผลเพิ่มเติมคุณควรใช้ทางลัดสำหรับการเปลี่ยนเส้นทางตามที่ Kennu อธิบายไว้ในที่นี้
Lie Ryan

1
ใน django 1.4 การอิมพอร์ต redirect_to ให้คำเตือน depracation
joctee

38

จริงๆแล้วมีวิธีที่ง่ายกว่าการมีมุมมองสำหรับการเปลี่ยนเส้นทางแต่ละครั้งคุณสามารถทำได้โดยตรงในurls.py:

from django.http import HttpResponsePermanentRedirect

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

เป้าหมายสามารถเป็น callable ได้เช่นเดียวกับ stringซึ่งเป็นสิ่งที่ฉันใช้อยู่ที่นี่


2
จริง แต่การใช้redirect_toมุมมองทั่วไปที่มาพร้อมกับ django นั้นง่ายกว่าและอ่านได้ง่ายกว่า ดู Carles ตอบstackoverflow.com/questions/523356/python-django-page-redirect/ …
วันที่

28

ตั้งแต่ Django 1.1 คุณยังสามารถใช้ง่ายเปลี่ยนเส้นทางลัด:

from django.shortcuts import redirect

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

นอกจากนี้ยังใช้การโต้แย้งคำหลักถาวร = True ไม่จำเป็น


14

หากคุณต้องการเปลี่ยนเส้นทางโฟลเดอร์ย่อยทั้งหมด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)ถ้าคุณต้องการคัดลอกสตริงแบบสอบถามด้วย


10

ด้วย 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


6

ระวัง. ฉันทำสิ่งนี้บนเซิร์ฟเวอร์การพัฒนาและต้องการเปลี่ยนในภายหลัง

ฉันต้องล้างแคชเพื่อเปลี่ยน เพื่อหลีกเลี่ยงการเกาหัวในอนาคตฉันสามารถทำให้มันชั่วคราวเช่น:

from django.views.generic import RedirectView

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



0

ควรใช้กับ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.