1. 程式人生 > 實用技巧 >django之路由

django之路由

Django路由系統

1.路由匹配

本質:url------>檢視函式,背後使用的是正則。

urlpatterns=[
    url(r"^index/",views.index)
]

url()函式的第一個引數是正則匹配,傳遞過來的url匹配上,就去找對應的檢視函式。

背後隱藏:Django配合瀏覽器

url(r"^index/",views.index)
位址列輸入http://127.0.0.1:8000/index,其實並沒有匹配上r"^index/"因為少了一個/

301是永久重定向,瀏覽器一共發了兩次請求,

第一次http://127.0.0.1:8000/index

第二次http://127.0.0.1:8000/index/

APPEND_SLASH=True,每個請求過來後,找到路由對應的檢視直接對映,沒有找到檢視的url在後面加/進行重定向,還是沒有就報錯了。
就是此配置做了優化,所以你要遵守規範,路徑最後加上/,無論是path函式,或者表單中的action,還是a的href屬性。

問題一:那我正則最後不加/不就行了麼?

為了相容不同的瀏覽器,有的瀏覽器會自動在url的最後給你加/

此時

url(r"^index",views.index)
位址列輸入http://127.0.0.1:8000/index沒毛病,可以匹配到
http://127.0.0.1:8000/index/此時就匹配不到了,立刻報錯!
因此為了相容

位址列網址拷貝,得到https://www.baidu.com/ 可以看到瀏覽器背後是有偷偷的在做事。

而web框架只能儘可能的去配合瀏覽器,是不能去改變瀏覽器,畢竟瀏覽器的廠家有很多。

問題二:為什麼是r"^index/",而不是r"^/index/"呢?開頭怎麼不加/,form的action,a的href的開頭都加了/

首先工作原理不一樣:

r"^index/"是路由匹配,django預設是從/後開始匹配,你再加/就匹配不上了。

form的action和a的href加/是因為瀏覽器,預設在前面加上ip和埠,路由拿到後也不會匹配前面的那個/

總結:只有路由匹配的開頭不加/,其他位置都要加/,包括redirect函式

django2.0的url函式沒了,需要re_path()才支援正則。

2.路由分發

settings.py檔案中有

ROOT_URLCONF = 'djdemo1.urls' 建立專案後這個總路由就確定了

多個app協同開發時,或者專案功能太多,進行劃分的時候,總路由負責加一級路徑對映到不同app

不同的app中, 將子路由對映到不同app的檢視函式中。

用到了include()函式

path(r"^classes/",include("classes.urls")), 尤其注意此api的引數是字串,app.urls而不是app.urls.py

3.路由傳參

4.反向解析

5.偽靜態