Django4.0 URL調(diào)度器-Django如何處理一個請求

2022-03-16 17:41 更新

當一個用戶請求 Django 站點的一個頁面,下面是 Django 系統(tǒng)決定執(zhí)行哪個 Python 代碼使用的算法:

1.Django 確定使用根 ?URLconf ?模塊。通常,這是 ?ROOT_URLCONF ?設(shè)置的值,但如果傳入 ?HttpRequest ?對象擁有 ?urlconf ?屬性(通過中間件設(shè)置),它的值將被用來代替 ?ROOT_URLCONF ?設(shè)置。
2.Django 加載該 Python 模塊并尋找可用的 ?urlpatterns ?。它是 ?django.urls.path()? 和(或) ?django.urls.re_path()? 實例的序列(?sequence?)。
3.Django 會按順序遍歷每個 URL 模式,然后會在所請求的URL匹配到第一個模式后停止,并與 ?path_info ?匹配。
4.一旦有 URL 匹配成功,Djagno 導(dǎo)入并調(diào)用相關(guān)的視圖,這個視圖是一個Python 函數(shù)(或基于類的視圖 ?class-based view? )。視圖會獲得如下參數(shù):

  • 一個 ?HttpRequest ?實例。
  • 如果匹配的 URL 包含未命名組,那么來自正則表達式中的匹配項將作為位置參數(shù)提供。
  • 關(guān)鍵字參數(shù)由路徑表達式匹配的任何命名部分組成,并由 ?django.urls.path()? 或 ?django.urls.re_path()? 的可選 ?kwargs ?參數(shù)中指定的任何參數(shù)覆蓋。

5.如果沒有 URL 被匹配,或者匹配過程中出現(xiàn)了異常,Django 會調(diào)用一個適當?shù)腻e誤處理視圖。參考下面的錯誤處理( ?Error handling? )。 

例如:

下面是一個簡單的 ?URLconf?:

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 中取值,使用尖括號。
  • 捕獲的值可以選擇性地包含轉(zhuǎn)換器類型。比如,使用 ?<int:name>? 來捕獲整型參數(shù)。如果不包含轉(zhuǎn)換器,則會匹配除了 ?/? 外的任何字符。
  • 這里不需要添加反斜杠,因為每個 URL 都有。比如,應(yīng)該是 ?articles ?而不是 ?/articles? 。

一些請求的例子:

  • ?/articles/2005/03/? 會匹配 URL 列表中的第三項。Django 會調(diào)用函數(shù) ?views.month_archive(request, year=2005, month=3)? 。
  • ?/articles/2003/ ?將匹配列表中的第一個模式不是第二個,因為模式按順序匹配,第一個會首先測試是否匹配。請像這樣自由插入一些特殊的情況來探測匹配的次序。在這里 Django 會調(diào)用函數(shù) ?views.special_case_2003(request)?
  • ?/articles/2003? 不匹配任何一個模式,因為每個模式要求 URL 以一個斜線結(jié)尾。
  • ?/articles/2003/03/building-a-django-site/? 會匹配 URL 列表中的最后一項。Django 會調(diào)用函數(shù) ?views.article_detail(request, year=2003, month=3, slug="building-a-django-site")? 。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號