Django自學筆記 2-2 URL詳細匹配規則
技術標籤:Django 自學筆記兼學習教程
======================= 大爽歌作,made by big shuang =======================
本文目錄
二 URL詳細匹配規則
本章第一節中我們簡單介紹了URL與View關係
簡單概括來說,網頁請求的
url
會通過urls.py
裡面的urlpatterns
列表中的urlpattern
來匹配對應的view
方法,然後view
方法會返回一個HttpResponse
過程示意如下:
url - > urlpattern - > view本節就來詳細說下這個匹配關係
本文參考文獻:module-django.urls.conf
1- urlpattern
urlpattern可以呼叫兩種函式獲得:django.urls.path()
與django.urls.re_path()
後者是用於正則匹配url的(新手一般用不到)
這兩種函式的引數和含義是一樣的
path(route, view, kwargs=None, name=None)
re_path(route, view, kwargs= None, name=None)
route
: 要匹配的urlview
: 匹配後要呼叫的view函式名kwargs
: 向view函式傳遞額外的引數(route
也可以傳遞引數給view
, 所以對於新手來說,kwargs
這個比較少用到)name
: urlpattern的名字,主要用於後面在模板中指定urlpattern。(因為url中間可能會修改,模板中寫死了的話,改起來麻煩)
2 - 傳參
本章第一節中我們舉了個最簡單的hello例子。 這裡我們進行一個簡單的拓展思考,如果這個hello後面要跟上訪問的人的名字呢
比如瀏覽器訪問http://127.0.0.1:8000/hello/tony
, 希望返回結果hello, tony
訪問http://127.0.0.1:8000/hello/Bob
, 希望返回hello, Bob
這個時候如果像第一節裡面那樣一個一個寫,就麻煩了,一個名字就要寫一個view方法,也不現實。
所以我們需要能夠把route的一些欄位作為引數傳遞給view函式
比如要將http://127.0.0.1:8000/hello/Bob
中的Bob
作為引數的話,那麼可以這麼寫
path('hello/<slug:name>', views.hello)
同時views.py中的hello方法也要新增一個引數勇於去接受這個傳入的變數
def hello(request, name):
return HttpResponse("Hello, %s" % name)
這裡細下這句'hello/<slug:name>'
- 若要從URL捕獲字串作為引數傳遞給view函式,需要使用尖括號,尖括號內寫捕獲後的變數名。
比如'hello/<name>'
就會將name
對應位置的字串捕獲並以name
作為變數名傳入view函式。 - 捕獲的值可以選擇性地包括轉換器型別,設定後會將捕獲後的字串轉換為對應型別。例如,使用
<int:value>
來捕獲整型引數, 其中:
前為轉換器型別,:
後為捕獲後的變數名。(如果不包含轉換器,則匹配除/
字元外的任何字串)
詳細官方文件:urls/#example
3 轉換器(converters)型別
Django預設的轉換器有:
str
:轉換器預設值,匹配除路徑分隔符'/
’外的任何非空字串int
:匹配零或任何正整數,返回一個int
。slug
:匹配由ASCII字母或數字以及連字元和下劃線組成的任何slug
字串。uuid
:匹配格式化的UUID,返回一個UUID
例項。path
:匹配任何非空字串,包括路徑分隔符’/’。
前三個用的比較多,新手應該暫時用不到後兩個。
同時對於更復雜的匹配需求,可以定義自己的路徑轉換器,
具體可查閱官方文件: registering-custom-path-converters
4 使用include
收納不同app的url
對於一個網站系統而言,可能會有很多功能模組app
,每個功能模組app
又有各自的urlpatterns
如果這些全部都放在專案資料夾project_name
下的專案名資料夾project_name/project_name
中的urls.py
中的話,
會很混亂也不方便管理,所以最好的辦法是,每個功能模組app
對應的urlpatterns放在app
資料夾下的,然後在project_name/project_name
中的urls.py
使用include
方法進行匯入。
以我在做的簡易教務系統為例,其有兩個app
: user
、course
要匯入 user
中的url到主url中的話,
則主urls.py
(詳細路徑為SSCMS/SSCMS/urls.py
)程式碼如下
from django.urls import path, include
urlpatterns = [
path('user/', include("user.urls")),
# ... other urlpatterns
]
其SSCMS/user/urls.py
為
from django.urls import path
from user import views
urlpatterns = [
path('login/', views.home, name="login"),
path('login/<slug:kind>', views.login, name="login"),
path('register/<slug:kind>', views.register, name="register"),
path('update/<slug:kind>', views.update, name="update"),
path('logout/', views.logout, name="logout"),
]
此事要訪問user
中的名為login
的urlpattern的話,瀏覽器應該請求的網站為
http://127.0.0.1:8000/user/login/
使用**include
方法**
實際上會將一組url“根植到”其他url之下。
比如上面的例子就將SSCMS/user/urls.py
中的urlpatterns“根植”到SSCMS/SSCMS/urls.py
中的user/
下。
更多細節,可見include
的官方文件:including-other-urlconfs