ควรใช้พา ธ () หรือ url () เป็น urls.py สำหรับ django 2.0 ดีกว่าไหม?


131

ในหลักสูตรออนไลน์ django ผู้สอนให้เราใช้url()ฟังก์ชั่นเพื่อเรียกดูและใช้การแสดงผลปกติในรายการ urlpatterns ฉันเคยเห็นตัวอย่างอื่นบน youtube ของสิ่งนี้ เช่น

from django.contrib import admin
from django.urls import include
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^polls/', include('polls.urls')),
]


#and in polls/urls.py

urlpatterns = [        
    url(r'^$', views.index, name="index"),
]

อย่างไรก็ตามในการผ่านการสอน Django พวกเขาใช้path()แทนเช่น:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name="index"),        
]

นอกจากนี้นิพจน์ทั่วไปดูเหมือนจะไม่ทำงานกับpath()ฟังก์ชั่นที่ใช้path(r'^$', views.index, name="index")ไม่สามารถหาmysite.com/polls/มุมมอง

การใช้งานpath()โดยไม่มี regex ตรงกับวิธีการที่เหมาะสมในอนาคตหรือไม่ คือurl()มีประสิทธิภาพมากขึ้น แต่มีความซับซ้อนมากขึ้นดังนั้นพวกเขากำลังใช้path()ในการเริ่มต้นเราออกมาด้วย? หรือเป็นกรณีของเครื่องมือต่าง ๆ สำหรับงานต่าง ๆ ?


2
หากคุณกำลังต่อไปกวดวิชาผมจะใช้แล้วแต่จำนวนใดรูปแบบการใช้งานที่กวดวิชาเพื่อป้องกันความผิดพลาดเมื่อมีการสลับระหว่างและpath() url()หากคุณต้องการหรือจำเป็นต้องใช้ regexes แล้วคุณจะต้องใช้หรือre_path() url()นอกเหนือจากนั้นฉันคิดว่ามันขึ้นอยู่กับคุณว่าจะเลือกแบบไหน
อะลาสแดร์

คำตอบ:


174

จากเอกสาร Django สำหรับurl

url(regex, view, kwargs=None, name=None)django.urls.re_path()ฟังก์ชั่นนี้เป็นชื่อแทน มีแนวโน้มที่จะถูกคัดค้านในการเปิดตัวในอนาคต

ความแตกต่างที่สำคัญระหว่างpathและre_pathคือการpathใช้เส้นทางโดยไม่ต้อง regex

คุณสามารถใช้re_pathสำหรับการโทร regex ที่ซับซ้อนและใช้pathเพื่อการค้นหาที่ง่ายขึ้น


1
ขอบคุณสำหรับข้อมูลรายละเอียด! re_pathคือสิ่งที่ฉันกำลังมองหา
FrostedCookies

65

django.urls.path()ฟังก์ชั่นใหม่นี้ช่วยให้ง่ายขึ้นและอ่านง่ายขึ้นไวยากรณ์การกำหนดเส้นทาง URL ตัวอย่างเช่นตัวอย่างนี้จากรุ่นก่อนหน้าของ Django:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)

สามารถเขียนเป็น:

path('articles/<int:year>/', views.year_archive)

ฟังก์ชั่นจากรุ่นก่อนหน้าอยู่ในขณะนี้django.conf.urls.url() django.urls.re_path()ตำแหน่งเดิมยังคงใช้งานร่วมกับระบบย้อนหลังได้โดยไม่ต้องเสียค่าใช้จ่าย django.conf.urls.include()ขณะนี้ฟังก์ชั่นเก่าสามารถนำเข้าได้django.urlsเพื่อให้คุณสามารถใช้:

from django.urls import include, path, re_path

ในURLconfs สำหรับการอ่านเพิ่มเติมdjango doc


10
ทำให้เข้าใจผิดเล็กน้อยเนื่องจากpath()ตัวอย่างของคุณอนุญาตตัวเลขที่ไม่ใช่ตัวเลขสี่หลัก
BrainCore

/<int:year>/หมายว่าในปีควรจะอยู่ในจำนวนเต็มผมขอแนะนำให้คุณมองผ่านเอกสารอย่างเป็นทางการ
Sylvernus Akubo

2
ในฐานะที่เป็น @silvablaze BrainCore กล่าวจะไม่เทียบเท่ากับint [0-9]{4}ไม่ว่าจะใช้สำหรับจำนวนเต็มหรือไม่มีความสัมพันธ์นี้ บางทีหากคุณแทนที่[0-9]{4}ด้วย[0-9]+การเปรียบเทียบของคุณอาจไม่ถูกต้องน้อยลงแม้ว่าคุณอาจต้องจัดการกับประเภทของผลลัพธ์สุดท้าย (str vs int?)
Jan Kyu Peblik

นั่นเป็นคำตอบที่ชัดเจนในเรื่อง ขอบคุณ
VikasBhat

19

pathใหม่ล่าสุดใน Django 2.0 ซึ่งวางจำหน่ายเมื่อไม่กี่สัปดาห์ที่ผ่านมา บทช่วยสอนส่วนใหญ่จะไม่ได้รับการอัปเดตสำหรับไวยากรณ์ใหม่

แน่นอนว่ามันควรจะเป็นวิธีที่ง่ายกว่าในการทำสิ่งต่าง ๆ ; ฉันจะไม่พูดว่า URL นั้นมีประสิทธิภาพมากกว่า แต่คุณควรจะสามารถแสดงรูปแบบในรูปแบบใดรูปแบบหนึ่งได้


9

การแสดงออกปกติดูเหมือนจะไม่ทำงานร่วมกับฟังก์ชั่นที่มีการขัดแย้งต่อไปนี้:path()path(r'^$', views.index, name="index")

มันควรจะเป็นแบบนี้: path('', views.index, name="index").

อาร์กิวเมนต์ที่ 1 จะต้องว่างเปล่าเพื่อป้อนนิพจน์ทั่วไป


2
ใช่ฉันคิดว่าตามที่กล่าวไว้ข้างต้นเพื่อใช้ REs ที่คุณต้องใช้ฟังก์ชัน re_path () แทน
FrostedCookies

8

Path เป็นคุณสมบัติใหม่ของ Django 2.0 อธิบายที่นี่: https://docs.djangoproject.com/en/2.0/releases/2.0/#whats-new-2-0

ดูเหมือนวิธี pythonic มากขึ้นและเปิดใช้งานเพื่อไม่ใช้นิพจน์ปกติในอาร์กิวเมนต์ที่คุณส่งผ่านไปดู ... คุณสามารถ ue int () ฟังก์ชันสำหรับ exemple


2

จาก v2.0 ผู้ใช้จำนวนมากกำลังใช้เส้นทาง แต่เราสามารถใช้เส้นทางหรือ URL ตัวอย่างเช่นในการทำแผนที่ django 2.1.1 ไปยังฟังก์ชั่นผ่าน url สามารถทำได้ดังนี้

from django.contrib import admin
from django.urls import path

from django.contrib.auth import login
from posts.views import post_home
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^posts/$', post_home, name='post_home'),

]

โดยที่ posts เป็นแอปพลิเคชัน & post_home เป็นฟังก์ชันใน views.py

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