淺析 Django 處理流程 和 結構分析 django 收藏
在Python 的Web 架構中,Django 是比較成功的。
它是一個進階Python web framework ,鼓勵快速開發和幹淨的、MVC 設計。
包括一個模闆系統,對象相關的映射和用于動态建立管理界面的架構。支援ORM 、Cache 、 i18n 、Admin 等衆多特性,是為了滿足“Deadlines” 項目而開發的。
先介紹一下目錄結構:
conf: 主要有兩個作用:1) 處理全局配置, 比如資料庫、加載的應用、MiddleWare 等 2) 處理urls 配置, 就是url 與view 的映射關系。
contrib: 由Django 的開發者貢獻的功能子產品,不過既然都已經随版本釋出,就表示是官方的。
core: Django 的核心處理庫,包括url 分析、處理請求、緩存等,其中處理請求是核心了,比如處理fastcgi 就是由wsgi.py 處理。
db: 顧名思義,處理與資料庫相關的,就是ORM 。
dispatch: 其實這不是Django 原創,是pydispatch 庫,主要處理消費者- 工作者模式。
forms newforms oldforms: 處理html 的表單,不用多介紹。
middleware: 中間件,就是處理HTTP 的request 和response 的,類似插件。比如預設的common 中間件的一個功能:當一個頁面沒有找對對應的pattern 時,會自定加上‘/’ 重新處理。比如通路/blog 時,而定義的pattern 是‘^blog/$’ ,是以找不到對應的pattern ,會自動再用/blog/ 查找,當然前提是APPEND_SLASH=True 。
template: Django 的模闆,我個人認為這塊是非常有創意的。
templatetags: 處理Application 的tag 的wrapper ,就是将INSTALLED_APPS 中所有的templatetags 目錄添加到 django .templatetags 目錄中,則當使用 {{load blog}} 記載tag 時,就可以使用 import django .templatetags.blog 方式加載了。不過這有一個問題,如果其他Application 目錄中也有blog.py ,這會加載第一個出現blog.py 的tag 。其實在 Django 中,有許多需要處理重名的地方,比如template ,需要格外小心,這個後續在介紹。
utils: 公共庫,很多公用的類都在放在這裡。
views: 最基本的view 方法。
Django 幾個重要的概念:
Project: 指一個完整的Web 服務,一般由多個子產品組成。
Application: 可以了解為子產品,比如使用者管理、部落格管理等,包含了資料的組成和資料的顯示,Applicaiton 都需要在project/settings.py 中INSTALLED_APPS 的定義。
Middleware: 就是處理request 和response 的插件, Middleware 都需要在project/settings.py 中MIDDLEWARE_CLASSES 的定義。
Loader: 模闆加載器, 其實就是為了讀取Template 檔案的類,預設的有通過檔案系統加載和在Application/template 目錄中加載,Loader 都需要在project/settings.py 中TEMPLATE_LOADERS 的定義。
下面以fastcgi 方式為例,Django 的版本是“0.97-pre-SVN-7053″ 。
其實和其他Web 架構一樣,HTTP 處理的流程大緻相同( 但和Tomcat 等Java 容器不相同) ,
比如request->response.
0) 加載配置
Django 的配置都在Project/settings.py 中定義,可以是Django 的配置,也可以是自定義的配置,并且都通過django .conf.settings 通路,非常友善。
1) 啟動
最核心動作的是通過django .core.management.commands.runfcgi 的Command 來啟動,它運作django .core.servers.fastcgi 中的runfastcgi ,runfastcgi 使用了flup 的WSGIServer 來啟動fastcgi 。而WSGIServer 中攜帶了django .core.handlers.wsgi 的WSGIHandler 類的一個執行個體,通過WSGIHandler 來處理由Web 伺服器( 比如Apache ,Lighttpd 等) 傳過來的請求,此時才是真正進入Django 的世界。
2) 處理 Request
當有HTTP 請求來時,WSGIHandler 就開始工作了, 它從 BaseHandler 繼承而來。WSGIHandler 為每個請求建立一個WSGIRequest 執行個體,而WSGIRequest 是從 http.HttpRequest 繼承而來。接下來就開始建立Response 了.
3) 建立 Response
BaseHandler 的get_response 方法就是根據request 建立 response ,而具體生成response 的動作就是執行urls.py 中對應的view 函數了,這也是Django 可以處理“ 友好URL” 的關鍵步驟,每個這樣的函數都要傳回一個Response 執行個體。此時一般的做法是通過loader 加載template 并生成頁面内容,其中重要的就是通過ORM 技術從資料庫中取出資料,并渲染到Template 中,進而生成具體的頁面了
4) 處理 Response
Django 傳回Response 給flup ,flup 就取出Response 的内容傳回給Web 伺服器,由後者傳回給浏覽器。