從著名的MVC模式開始說起
所謂的MVC就是把Web應用分為模型(M)控制器(C)和視圖(V)三層,他們之間以一種插件式的、松耦合的房還是
連接在一起,模型負責業務對象與數據庫的映射(ORM),視圖負責與用戶的交互頁面(頁面),控制器接受用戶輸入條
用模型和視圖完成用戶的請求,其示意圖如下所示:
django的MTV模式的本質和MVC是一樣的,也是為了各組件間保持松耦合關系,只是定義有些不同,django的mtv分別是:
- M 帶包模型(Model) 負責業務對象和數據庫的關系映射(ORM)
- T 代表模板(Template) 負責如何把頁面展示給用戶(html)
- V 代表視圖 (View) 負責業務邏輯 並在適當時候調用Mode和Template
- 出了以上三層外,還需要一個URL分發器、他的作用是講一個個URL的頁面請求分發給不同的View處理,
View在調用相關的Mode和Template,MTV的相應模式如下所示:
- web服務器(中間件)收到一個http請求
- Django在URLconf里查找對應的視圖(view)函數來處理http請求
- 視圖函數調用相應的數據模型來存儲數據、調用相應的模板向用戶展示頁面
- 視圖函數處理結束后返回一個http的相應給web服務器
- web 服務器將響應發送給客戶端
這種設計模式關鍵的優勢在與各種組都是松耦合的額,這樣,每個有django驅動的web應用都有 着明確的目的,並且可獨立更改而不影響其他的部分。 比如,開發者更改一個應用程序的URL而不用影響到這個程序底層的實現。設計師可以更改HTML頁面 的樣式而不用接觸python代碼 數據庫管理員可以重新命名數據庫表並且只需要更改模型,無需從一大堆文件中進行查找和替換。
落實到實處 django的MTV模式相對應的python文件如下:
urls.py詳解
URl分發器 (路由配置文件)
URL配置(URLconf)就像django所支持網站的目錄。它在本質是URL模式以及要為改URL 模式調用的視圖函數之間的映射表。你就是這種方式告訴django,對於這個URL嗲用這段代碼, 對於那個URL調用那段代碼,URL的加載時從配置文件中開始。
1. urlpatterns 的兩種形式
沒有前綴的情況,使用的列表(推薦方式) urlpatterns = [ url(r'^hello/$', views.hello), ] 有前綴的情況,使用patterns過時的方法
方法
from django.conf.urls import url,patterns from hello import views urlpatterns = patterns('',url(r'^hello/$', views.hello)) 或 from django.conf.urls import patterns urlpatterns = patterns('hello',url(r'^hello/$', 'views.hello'),)
2. URL模式
urlpatterns =[ url(正則表方式,view函數,參數,別名,前綴) ]
參數說明:
- 一個正則表達式字符串
- 一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串。
- 可選的要傳遞給視圖函數的默認參數(字典形式)
- 一個可選的name參數
- 路徑前綴
3 URL 分解器 include函數
通常一個URL分解器對應一個URL配置模塊,他可以包含多個url模式, 也可以包含多個其他URL分解器,通過這種包含結構設計,實現django對URL的層級解析。
URL分解器是django實現app與項目解耦的關鍵,通常include方法操作的url配置模塊,最終 會被解釋成URL分解器
預留的問題,為什么admin模塊引入的時候沒有使用include
url(r'^admin/', admin.site.urls),
URL常見寫法示例 正則表達式
url(r'^test/\d{2}/$',views.test) url(r'^test/(?P<id>\d{2})/$',views.test) ===>test(id) url(r'^test2/(?P<id>\d{2})/(?P<key>\w+)/$',views.test) ==》test(id,key)
關於正則表達式的使用可以參考 建議爬蟲實戰中的正則表達式