在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
服務器,由後者返回給瀏覽器。
總之,Django
在fastcgi
中主要做了兩件事:處理Request
和創建Response
,而它們對應的核心就是“urls
分析”
、“
模板技術”
和“ORM
技術”
,這些留在以後分析。
附圖