淺析 Django 處理流程 和 結構分析 django

 

PythonWeb 框架中,Django 是比較成功的。

它是一個高級Python web framework ,鼓勵快速開發和乾淨的、MVC 設計。

包括一個模板系統,對象相關的映射和用於動態創建管理界面的框架。支持ORMCache i18nAdmin 等衆多特性,是爲了滿足“Deadlines” 項目而開發的。

先介紹一下目錄結構:
conf: 
主要有兩個作用:1)  處理全局配置 比如數據庫、加載的應用、MiddleWare 2)  處理urls 配置 就是urlview 的映射關係。

contrib: Django 的開發者貢獻的功能模塊,不過既然都已經隨版本發佈,就表示是官方的。

core: Django 的核心處理庫,包括url 分析、處理請求、緩存等,其中處理請求是核心了,比如處理fastcgi 就是由wsgi.py 處理。

db:  顧名思義,處理與數據庫相關的,就是ORM

dispatch:  其實這不是Django 原創,是pydispatch 庫,主要處理消費者- 工作者模式。

forms newforms oldforms:  處理html 的表單,不用多介紹。

middleware:  中間件,就是處理HTTPrequestresponse 的,類似插件。比如默認的common 中間件的一個功能:當一個頁面沒有找對對應的pattern 時,會自定加上‘/’ 重新處理。比如訪問/blog 時,而定義的pattern‘^blog/$’ ,所以找不到對應的pattern ,會自動再用/blog/ 查找,當然前提是APPEND_SLASH=True

template: Django 的模板,我個人認爲這塊是非常有創意的。

templatetags:  處理Applicationtagwrapper ,就是將INSTALLED_APPS 中所有的templatetags 目錄添加到 django .templatetags 目錄中,則當使用 {{load blog}} 記載tag 時,就可以使用 import django .templatetags.blog  方式加載了。不過這有一個問題,如果其他Application 目錄中也有blog.py ,這會加載第一個出現blog.pytag 。其實在 Django 中,有許多需要處理重名的地方,比如template ,需要格外小心,這個後續在介紹。

utils:  公共庫,很多公用的類都在放在這裏。

views:  最基本的view 方法。

Django 幾個重要的概念:
Project: 
指一個完整的Web 服務,一般由多個模塊組成。

Application:  可以理解爲模塊,比如用戶管理、博客管理等,包含了數據的組成和數據的顯示,Applicaiton 都需要在project/settings.pyINSTALLED_APPS 的定義。


Middleware: 
就是處理requestresponse 的插件, Middleware 都需要在project/settings.pyMIDDLEWARE_CLASSES 的定義。

Loader:  模板加載器 其實就是爲了讀取Template 文件的類,默認的有通過文件系統加載和在Application/template 目錄中加載,Loader 都需要在project/settings.pyTEMPLATE_LOADERS 的定義。

下面以fastcgi 方式爲例,Django 的版本是“0.97-pre-SVN-7053″

其實和其他Web 框架一樣,HTTP 處理的流程大致相同( 但和TomcatJava 容器不相同)

比如request->response.

0)  加載配置
Django
的配置都在Project/settings.py 中定義,可以是Django 的配置,也可以是自定義的配置,並且都通過django .conf.settings 訪問,非常方便。

1)  啓動
最核心動作的是通過django .core.management.commands.runfcgiCommand 來啓動,它運行django .core.servers.fastcgi 中的runfastcgirunfastcgi 使用了flupWSGIServer 來啓動fastcgi 。而WSGIServer 中攜帶了django .core.handlers.wsgiWSGIHandler 類的一個實例,通過WSGIHandler 來處理由Web 服務器( 比如ApacheLighttpd) 傳過來的請求,此時纔是真正進入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
返回Responseflupflup 就取出Response 的內容返回給Web 服務器,由後者返回給瀏覽器。

總之,Django fastcgi 中主要做了兩件事:處理Request 和創建Response ,而它們對應的核心就是“urls 分析 模板技術“ORM 技術 ,這些留在以後分析。 附圖
f8437b5848234d94810a1817

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章