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

2022-03-16 17:41 更新

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

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

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

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

例如:

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

一些請(qǐng)求的例子:

  • ?/articles/2005/03/? 會(huì)匹配 URL 列表中的第三項(xiàng)。Django 會(huì)調(diào)用函數(shù) ?views.month_archive(request, year=2005, month=3)? 。
  • ?/articles/2003/ ?將匹配列表中的第一個(gè)模式不是第二個(gè),因?yàn)槟J桨错樞蚱ヅ?,第一個(gè)會(huì)首先測試是否匹配。請(qǐng)像這樣自由插入一些特殊的情況來探測匹配的次序。在這里 Django 會(huì)調(diào)用函數(shù) ?views.special_case_2003(request)?
  • ?/articles/2003? 不匹配任何一個(gè)模式,因?yàn)槊總€(gè)模式要求 URL 以一個(gè)斜線結(jié)尾。
  • ?/articles/2003/03/building-a-django-site/? 會(huì)匹配 URL 列表中的最后一項(xiàng)。Django 會(huì)調(diào)用函數(shù) ?views.article_detail(request, year=2003, month=3, slug="building-a-django-site")? 。


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)