Django 路由 —— Djangon如何處理一個請求

 

Django URL路由概述正則表達式

一個乾淨優雅的URL方案是高質量Web應用程序中的一個重要細則
Django能夠讓你設計URL,不管你想要什麼,沒有框剪限制
要爲應用程序設計URL,您能夠非正式地建立一個名爲URLconf(URL configura URL配置)的Python模塊。
這個模塊是純Python代碼,是一個簡單的Python模式(簡單的正則表達式)到Python函數(您的視圖)之間的映射算法

 

Djangon如何處理一個請求django

當用戶從Django服務器站點請求頁面時,系統遵循如下算法來肯定要執行的Python代碼:服務器


1.  首先Django肯定要使用的根URLconf模塊。經過 ROOT_URLCONF 來設置,具體在 settings.py 配置文件中。函數

      可是若是傳入HttpRequest對象具備urlconf屬性(由中間件設置),則其值將替換ROOT_URLCONF設置。測試

2. Django加載該Python模塊並查找該變量urlpatterns。這應該是一個Python的django.conf.urls.url()實例列表。url


3. Django按順序運行每一個URL模式,並在匹配所請求的URL的第一個URL中中止。spa


4. 一旦正則表達式匹配,Django將導入並調用給定的視圖,這是一個簡單的PYthon函數(或基於類的視圖)。該視圖經過如下參數傳遞:設計

  • 4.1 一個實例 HttpRequest。
  • 4.2 若是匹配的正則表達式沒有返回任何命名組,那麼來自正則表達式的匹配將做爲位置參數提供。
  • 4.3 關鍵字參數由正則表達式匹配的任何命名組組成,由可選kwargs參數中指定的任何參數覆蓋django.conf.urls.url()

5. 若是沒有正則表達式匹配,或在此過程當中的任何一點出現異常,Django將調用適當的錯誤處理視圖。code

 

示例
如下是一個URLconf示例:

 1 from django.conf.urls import url  2  3 from . import views  4  5 urlpatterns = [  6 url(r'^articles/2003/$', views.special_case_2003),  7 url(r'^articles/([0-9]{4})/$', views.year_archive),  8 url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),  9 url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), 10 ]

說明:
1. 要從URL捕獲一個值,只須要將其括起來
2.沒有必要添加一個主要的斜槓,由於每一個URL都含有。例如^articles , 不是 ^/articles。
3.正則表達式前面的 'r' 是可選的,可是推薦使用。它告訴Python 這個字符串是一個'raw'(元字符串,字符串中沒有任何內容被轉義)

請求示例:
/articles/2005/03/    將匹配列表中的第三個條目。Django會調用views.month_archive(request, '2005', '03')函數

/articles/2005/3/      不會匹配其中的任何 URL模式 。由於第三個條目中 views.month_archive 月份須要兩位數字。

/articles/2003/         將匹配列表中的第一個個模式,而不是第二個。由於模式是按順序測試的,第一個模式是 第一個經過測試 的 。像這樣能夠很隨意地插入一些特殊的模式。在這裏,Django會調用 views.special_case_2003(request)

/articles/2003           將不匹配這些模式中的任何一個,由於每一個模式都要求URL以斜槓結尾。

/articles/2003/03/03/  將會匹配最後一個模式,Django會調用 views.article_detail(request, '2003', '03', '03') 函數


注意:每一個捕獲的參數都做爲純Python字符串發送到視圖,不管正則表達式匹配的是什麼,即便[0-9]{4} 只會匹配整數字符串。

相關文章
相關標籤/搜索