在當(dāng)代的web應(yīng)用中来氧,清晰優(yōu)雅的URL非常重要舒憾,在Django框架中稚疹,你可以隨心所欲的設(shè)計(jì)你的URL居灯,不用擔(dān)心框架的限制。
概覽
為了給一個(gè)app設(shè)計(jì)URL内狗,你創(chuàng)建一個(gè)Python模塊叫做URLConf
怪嫌,這個(gè)模塊是純Python代碼并且用于于映射URL路徑和Python的功能或視圖。
這個(gè)映射關(guān)系可以寫(xiě)的比較短柳沙,它也可以引用其它的映射岩灭,并且由于它是純代碼,所有它可以動(dòng)態(tài)的構(gòu)建赂鲤。
Django如何處理請(qǐng)求
當(dāng)用戶請(qǐng)求一個(gè)由Django構(gòu)建的網(wǎng)站噪径,下面是Django的處理方式來(lái)決定執(zhí)行那一部分的Python代碼
- Django找到root(根)URLconf模塊柱恤,根模塊一般與項(xiàng)目同名的目錄下,當(dāng)然這個(gè)可以在ROOT_URLCONF配置中設(shè)置找爱,但是如果請(qǐng)求的HttpRequest對(duì)象由urlconf屬性(通過(guò)中間件設(shè)置)梗顺,它的值將會(huì)用于替換 ROOT_URLCONF的設(shè)置。
- Django加載python的模塊车摄,然后朝找urlpattern變量寺谤,這個(gè)應(yīng)該是一系列的
django.urls.path()
或者django.urls.re_path()
的實(shí)例 - Django遍歷URL樣式,在第一個(gè)匹配請(qǐng)求的時(shí)候停止遍歷吮播。
- 一旦其中的一個(gè)URL樣式被匹配了变屁,django導(dǎo)入和調(diào)用提供的視圖,一般是Python的函數(shù)意狠,視圖將會(huì)傳遞下面的參數(shù)
- 一個(gè)HttpRequest的實(shí)例
- 如果匹配的URL樣式返回?zé)o命名的組敞贡,那么從正則表達(dá)式中匹配的部分將作為對(duì)應(yīng)位置的參數(shù)
- 關(guān)鍵參數(shù)由匹配路徑表達(dá)式的命名部分組成,由指定的參數(shù)覆蓋.
- 如果沒(méi)有URL匹配摄职,或者拋出了異常,Django將會(huì)調(diào)用一個(gè)合適的錯(cuò)誤處理視圖获列。
案例
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
注意:
- 想要從URL中捕捉值谷市,使用尖括號(hào)
- 捕捉值可以包含轉(zhuǎn)換后的類(lèi)型,例如<int:name>捕捉的是整數(shù)击孩,如果轉(zhuǎn)換器沒(méi)有包括進(jìn)來(lái)迫悠,任何字符串除了
/
也可以匹配 - 在開(kāi)頭部分不需要天劍
/
,因?yàn)樗?articles
巩梢,不是/articles
請(qǐng)求映射:
- 請(qǐng)求/article/2005/03/ 對(duì)應(yīng)列表中的第三個(gè)條目创泄,django會(huì)調(diào)用views.month_archive(request,year=2005,month=3)
- 請(qǐng)求 /article/2003/ 對(duì)應(yīng)列表中的第一個(gè),因?yàn)閐jango找到符號(hào)規(guī)則的就停下來(lái)了括蝠。調(diào)用views.special_case_2003(request)函數(shù)
- /article/2003 不會(huì)匹配任何一個(gè)條目鞠抑,因?yàn)槊恳粋€(gè)條目后面都有一個(gè)
/
- /articles/2003/03/building-a-django-site/ 匹配最后一個(gè)條目,調(diào)用views.article_detail(request, year=2003, month=3, slug="building-a-django-site") 函數(shù)
Path Converter(路徑轉(zhuǎn)換器)
下面這些是默認(rèn)可用的轉(zhuǎn)換器
- str: 匹配非空字符串忌警,除了
/
搁拙。這個(gè)是默認(rèn)的轉(zhuǎn)換器 - int 匹配0或者任何正整數(shù)
- slug 匹配ASCII租車(chē)的字符串,加上
-
和_
法绵。例如today_is-2018-10
也可以 - path 匹配非空的字符串箕速,包含
/
,這個(gè)可以匹配一個(gè)完整的URL朋譬,而不僅僅是路徑中的一個(gè)片段(str)
當(dāng)然也可以注冊(cè)自己的轉(zhuǎn)換器盐茎,也不麻煩,可以參考官方文檔
使用正則表達(dá)式
如果路徑轉(zhuǎn)換器的語(yǔ)法不夠高效來(lái)定義你的URL樣式徙赢,你可以使用正則表達(dá)式字柠,這時(shí)使用re_path
探越,而不是path
正則表達(dá)式的語(yǔ)法為:
(?P<name>pattern) ,name是組名募谎,pattern是要匹配的樣式
看下面的例子扶关,這樣的表達(dá)實(shí)現(xiàn)了和剛才使用轉(zhuǎn)換器同樣的功能。
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$',views.article_detail),
]
額外
- URLconf模塊只是用來(lái)匹配路徑数冬,并不處理請(qǐng)求方法节槐,像GET,POST拐纱,PUT等不同類(lèi)型的請(qǐng)求也會(huì)路由到同一個(gè)Python函數(shù)中铜异。
- 使用include可以引入其他的url模塊。
最后
以上的基本能滿足初步的開(kāi)發(fā)秸架,先暫時(shí)到這里揍庄。