1. 程式人生 > 其它 >Django自學筆記 2-2 URL詳細匹配規則

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 : 要匹配的url
  • view : 匹配後要呼叫的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>'

  1. 若要從URL捕獲字串作為引數傳遞給view函式,需要使用尖括號,尖括號內寫捕獲後的變數名。
    比如'hello/<name>'就會將name對應位置的字串捕獲並以name作為變數名傳入view函式。
  2. 捕獲的值可以選擇性地包括轉換器型別,設定後會將捕獲後的字串轉換為對應型別。例如,使用<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: usercourse
要匯入 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