Django - การแมป URL
ตอนนี้เรามีมุมมองการทำงานตามที่อธิบายไว้ในบทก่อนหน้านี้ เราต้องการเข้าถึงมุมมองนั้นผ่าน URL Django มีวิธีการแมป URL ของตัวเองและทำได้โดยการแก้ไขไฟล์ url.py โครงการของคุณ(myproject/url.py). ไฟล์ url.py มีลักษณะดังนี้ -
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
#Examples
#url(r'^$', 'myproject.view.home', name = 'home'),
#url(r'^blog/', include('blog.urls')),
url(r'^admin', include(admin.site.urls)),
)
เมื่อผู้ใช้ส่งคำขอหน้าเว็บบนแอปพลิเคชันของคุณตัวควบคุม Django จะเข้ามาค้นหามุมมองที่เกี่ยวข้องผ่านไฟล์ url.py จากนั้นส่งคืนการตอบกลับ HTML หรือข้อผิดพลาด 404 ไม่พบหากไม่พบ ใน url.py สิ่งที่สำคัญที่สุดคือไฟล์"urlpatterns"ทูเพิล เป็นที่ที่คุณกำหนดการจับคู่ระหว่าง URL และมุมมอง การแมปเป็นทูเพิลในรูปแบบ URL เช่น -
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
#Examples
#url(r'^$', 'myproject.view.home', name = 'home'),
#url(r'^blog/', include('blog.urls')),
url(r'^admin', include(admin.site.urls)),
url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)
บรรทัดที่ทำเครื่องหมายจะจับคู่ URL "/ home" กับมุมมอง hello ที่สร้างในไฟล์ myapp / view.py ดังที่คุณเห็นด้านบนการทำแผนที่ประกอบด้วยสามองค์ประกอบ -
The pattern- regexp ที่ตรงกับ URL ที่คุณต้องการแก้ไขและแมป ทุกสิ่งที่สามารถทำงานกับโมดูล 're' ของ python มีสิทธิ์สำหรับรูปแบบ (มีประโยชน์เมื่อคุณต้องการส่งผ่านพารามิเตอร์ผ่าน url)
The python path to the view - เหมือนกับเวลาที่คุณกำลังนำเข้าโมดูล
The name- ในการดำเนินการกลับ URL คุณจะต้องใช้รูปแบบ URL ที่มีชื่อดังที่ทำในตัวอย่างด้านบน เมื่อเสร็จแล้วเพียงแค่เริ่มเซิร์ฟเวอร์เพื่อเข้าถึงมุมมองของคุณผ่าน: http: //127.0.0.1/hello
การจัดระเบียบ URL ของคุณ
จนถึงตอนนี้เราได้สร้าง URL ในไฟล์“ myprojects / url.py” แล้วอย่างไรก็ตามตามที่ระบุไว้ก่อนหน้านี้เกี่ยวกับ Django และการสร้างแอปจุดที่ดีที่สุดคือสามารถนำแอปพลิเคชันกลับมาใช้ในโครงการต่างๆได้ คุณสามารถดูได้อย่างง่ายดายว่าปัญหาคืออะไรหากคุณบันทึก URL ทั้งหมดไว้ในไฟล์“ projecturl.py” แนวทางปฏิบัติที่ดีที่สุดคือการสร้าง“ url.py” ต่อแอปพลิเคชันและรวมไว้ในไฟล์ url.py โครงการหลักของเรา (เรารวม URL ของผู้ดูแลระบบสำหรับอินเทอร์เฟซผู้ดูแลระบบไว้ก่อน)
เป็นอย่างไรบ้าง?
เราจำเป็นต้องสร้างไฟล์ url.py ใน myapp โดยใช้รหัสต่อไปนี้ -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)
จากนั้น myproject / url.py จะเปลี่ยนเป็นดังต่อไปนี้ -
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
#Examples
#url(r'^$', 'myproject.view.home', name = 'home'),
#url(r'^blog/', include('blog.urls')),
url(r'^admin', include(admin.site.urls)),
url(r'^myapp/', include('myapp.urls')),
)
เราได้รวม URL ทั้งหมดจากแอปพลิเคชัน myapp home.html ที่เข้าถึงผ่าน“ / hello” ตอนนี้คือ“ / myapp / hello” ซึ่งเป็นโครงสร้างที่ดีขึ้นและเข้าใจได้มากขึ้นสำหรับเว็บแอป
สมมติว่าเรามีมุมมองอื่นใน myapp“ ตอนเช้า” และเราต้องการแมปใน myapp / url.py จากนั้นเราจะเปลี่ยน myapp / url.py เป็น -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^hello/', 'myapp.views.hello', name = 'hello'),
url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)
สิ่งนี้สามารถนำมาพิจารณาใหม่เพื่อ -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),)
อย่างที่คุณเห็นตอนนี้เราใช้องค์ประกอบแรกของไฟล์ urlpatternsทูเพิล สิ่งนี้จะมีประโยชน์เมื่อคุณต้องการเปลี่ยนชื่อแอปของคุณ
การส่งพารามิเตอร์ไปยังมุมมอง
ตอนนี้เรารู้วิธีแมป URL วิธีจัดระเบียบตอนนี้ให้เราดูวิธีส่งพารามิเตอร์ไปยังมุมมอง ตัวอย่างคลาสสิกคือตัวอย่างบทความ (คุณต้องการเข้าถึงบทความผ่านทาง“ / บทความ / article_id”)
การส่งผ่านพารามิเตอร์ทำได้โดยการบันทึกด้วยไฟล์ regexpในรูปแบบ URL หากเรามีมุมมองดังต่อไปนี้ใน“ myapp / view.py”
from django.shortcuts import render
from django.http import HttpResponse
def hello(request):
return render(request, "hello.html", {})
def viewArticle(request, articleId):
text = "Displaying article Number : %s"%articleId
return HttpResponse(text)
เราต้องการแมปใน myapp / url.py เพื่อให้เราสามารถเข้าถึงได้ผ่าน“ / myapp / article / articleId” เราต้องการสิ่งต่อไปนี้ใน“ myapp / url.py” -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),
url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)
เมื่อ Django เห็น url:“ / myapp / article / 42” มันจะส่งผ่านพารามิเตอร์ '42' ไปยังมุมมอง viewArticle และในเบราว์เซอร์ของคุณคุณจะได้รับผลลัพธ์ต่อไปนี้ -
โปรดทราบว่าลำดับของพารามิเตอร์มีความสำคัญที่นี่ สมมติว่าเราต้องการรายชื่อบทความของเดือนของปีให้เพิ่มมุมมอง viewArticles view.py ของเรากลายเป็น -
from django.shortcuts import render
from django.http import HttpResponse
def hello(request):
return render(request, "hello.html", {})
def viewArticle(request, articleId):
text = "Displaying article Number : %s"%articleId
return HttpResponse(text)
def viewArticle(request, month, year):
text = "Displaying articles of : %s/%s"%(year, month)
return HttpResponse(text)
ที่สอดคล้องกัน url.py ไฟล์จะมีลักษณะดังนี้ -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),
url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)
ตอนนี้เมื่อคุณไปที่“ / myapp /icles / 12/2006 /” คุณจะได้รับ 'แสดงบทความของ: 2006/12' แต่ถ้าคุณย้อนกลับพารามิเตอร์คุณจะไม่ได้ผลลัพธ์เหมือนกัน
เพื่อหลีกเลี่ยงสิ่งนั้นคุณสามารถเชื่อมโยงพารามิเตอร์ URL กับพารามิเตอร์มุมมอง สำหรับสิ่งนั้นurl.py จะกลายเป็น -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),
url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)