Django之HttpServer伺服器分析詳解
本文轉載自: http://www.it610.com/article/3184580.htm
大家知道,軟體的正向工程,是從軟體的需求獲取開始,大概經歷需求分析,概要分析,領域分析,設計分析,詳細設計,程式碼實現,部署,實施這幾個步驟,最終交付給使用者使用。而在某些時候,比如某個軟體產品是用PHP開發的,因為某些原因,我們想移植到JAVA平臺去。或者某公司看到某個軟體的市場前景很好,想COPY它的主要功能,然後經過加工潤色後推出一個具有相同功能,更好使用者體驗或更多功能的軟體。或者單純的以研究軟體的結構、設計思想為目的。基於這些需求,我們需要逆向工程。正向工程是一個從過程匯出結果的步驟,而逆向工程是從結果推匯出過程,逆向工程從程式碼出發,最後的成果往往是分析模型,從分析模型,我們可以得到產品的設計思想。
Django是python的一個Web開源框架。在生產環境下,它通過wsgi介面與apache的mod_wsgi通訊,完成程式碼解析,根據url請求,執行相應程式碼並將返回結果通過http協議傳輸結果呈現給使用者。在開發環境下,我們常常使用Django自帶的webserver進行開發與除錯。由此Django無需任何其它元件(如apache)的支援,就可以形成一個完整的基於python的web解決方案。
在此,我將與大家粗略的探討一下Django是如何工作的,而研究的方法就是上面所提到的逆向工程。廢話就不多說了,讓我們開始。
要想知道Django是如何工作的,首先得研究下Django提供的Webserver。因為它是Http請求的入口,Http響應的出口。它接收使用者在瀏覽器輸入的URL,然後經過一系列複雜的操作,變成了使用者想要的內容,並將內容通過Http傳送給使用者。所以,Webserver將是我們研究Django的切入點。
Webserver
包與類的關係結構圖
Webserver所需要的類和包大致如上圖所示(某些配置相關的類沒有在上圖中表示出來),由於Python語言的特性,在上圖中我們看到的以.py字尾結尾的是python檔案,我們也可以把它當作是一個package。以.class字尾結尾的代表類。雖然Django框架不是用完全面向物件的思想來開發的,但完全可以用面向物件的思想去分析它。下表將展示包的描述。
包名 | 父級包 | 在WebServer中起到的作用 |
BaseHTTPserver.py | N/A | 提供http請求處理類的包 |
contrib |
django | 提供Django框架的一般性部件 |
handlers.py | django.contrib | 提供處理http請求類的包 |
staticfiles | django.contrib | 提供處理http請求類的包 |
management | django.contrib.staticfiles | 提供管理“處理http請求物件”類的包 |
commands | django.contrib.staticfiles.management | 提供管理“處理http請求物件”類的包 |
runserver.py | django.contrib.staticfiles.management.commands | 提供管理“處理http請求物件”類的包 |
core | django | 提供Django框架的引擎 |
handlers | django.core | 提供處理http請求核心類的包 |
base.py | django.core.handlers | 提供處理http請求核心類的包 |
wsgi.py | django.core.handlers | 提供處理http請求核心類的包 |
management | django.core | 提供管理“處理http請求物件”核心類的包 |
__init__.py | django.core.management | 提供管理“處理http請求物件”核心類的包 |
base.py | django.core.management | 提供管理“處理http請求物件”核心類的包 |
commands | django.core.management | 提供管理“處理http請求物件”核心類的包 |
runserver.py | django.core.management.commands | 提供管理“處理http請求物件”核心類的包 |
servers | django.core |
提供實現伺服器執行類的包 提供處理http請求類的包 |
basehttp.py | django.core.servers |
提供實現伺服器執行類的包 提供處理http請求類的包 |
SocketServer.py | N/A |
提供實現伺服器執行類的底層包 提供處理http請求類的底層包 |
wsgiref | N/A |
提供實現伺服器執行類的底層包 提供處理http請求類的底層包 |
handlers.py | wsgiref |
提供實現伺服器執行類的底層包 提供處理http請求類的底層包 |
simple_server.py | wsgiref |
提供實現伺服器執行類的底層包 提供處理http請求類的底層包 |
看似包很多,但仔細觀察,我們會發現,包聚集的無非是執行http伺服器、管理http請求、處理http請求這三種類,只是所在的層次不一樣,SocketServer.py包與BaseHTTPserver.py包提供最底層的實現,wsgiref包提供過渡層的實現,django包提供應用層的實現。
包示意圖
從上圖看來,可能會對包的結構有一個更加直觀的瞭解。WebServer的執行是由management包來驅動排程的。management包啟動server,並等待tcp連線過來,management包還會建立一個request handle的例項。當有一個連線過來時,這個request handle例項會呼叫handle例項(也就是staticfilehandle物件)進行相應的邏輯處理,如載入檢視中介軟體,模板中介軟體等一系列的操作,並將處理結果寫入socket,傳送給瀏覽器。從包圖上我們可以瞭解系統模組間的互動關係,如果要更加深入的理解細節,我們需要對包中的類進行分析。下表將展示類的描述。
類名 | 所屬包 | 父級 | 在WebServer中起到的作用 |
BaseHTTPRequestHandler | BaseHTTPserver.py | StreamRequestHandler | request handle底層類 |
StaticFilesHandler |
django.contrib .staticfiles.handlers.py |
WSGIHandler | 處理http請求的實體,使用者邏輯處理,產生http響應結果,屬於handle模組 |
Command |
django.contrib. staticfiles.management .commands.runserver.py |
RunserverCommand | 排程類,取得handle實體物件等 |
BaseHandler |
django.core .handlers.base.py |
N/A | handle基類 |
WSGIHandler |
django.core .handlers.wsgi.py |
BaseHandler | handle類,負責django框架handle的核心邏輯。 |
BaseCommand | django.core.management.base.py | N/A | 排程基類 |
Command as RunserverCommand |
django.core.management .commands.runserver.py |
BaseCommand | 排程類,負責django框架排程的核心邏輯。 |
WSGIRequestHandler |
django.core .servers.basehttp.py |
simple_server. WSGIRequestHandler |
request handle核心類 |
WSGIServer |
django.core .servers.basehttp.py |
simple_server. WSGIServer |
建立http伺服器 |
BaseRequestHandler | SocketServer.py | N/A | request handle底層類,呼叫handle模組獲取http響應,寫入socket |
BaseServer | SocketServer.py | N/A | 建立http伺服器 |
StreamRequestHandler | SocketServer.py | BaseRequestHandler | request handle底層類 |
TCPServer | SocketServer.py | BaseServer | 建立http伺服器 |
BaseHandler | wsgiref.handlers.py | N/A | request handle與handle模組之間的代理類,request handle通過該類呼叫handle物件 |
SimpleHandler | wsgiref.handlers.py |
wsgiref .handlers.py. BaseHandler |
request handle與handle模組之間的代理類,request handle通過該類呼叫handle物件 |
WSGIRequestHandler |
wsgiref .simple_server.py |
BaseHTTPRequestHandler | request handle底層類 |
WSGIServer |
wsgiref .simple_server.py |
HTTPServer | 建立http伺服器 |
HTTPServer | BaseHTTPserver.py | TCPServer | 建立http伺服器 |
ServerHandler |
wsgiref .simple_server.py |
SimpleHandler | request handle與handle模組之間的代理類,request handle通過該類呼叫handle物件 |
經過分析後,我們可以得出執行WebServer及處理Http請求所需的類靜態圖,通過類靜態檢視與分析除錯,我們可以得出物件的時序圖。我們可以將WebServer的監聽及處理當作兩個用例來處理,由此可以得出針對這兩種不同用例的時序圖,如下所示:
類的靜態圖
類的時序圖
伺服器執行時序圖
處理請求時序圖
至此,我們建立了Django框架中自帶HttpServer的設計模型,有了設計模型,我們可以通過它反推出分析模型。如果我們以移植為目的(如需要做一個JAVA版的HttpServer),可以在得到分析模型後,再開始針對JAVA進行設計建模,然後進行程式碼編寫。如果以優化裁剪為目的,我認為推匯出設計模型已經足夠了,可以開始思考如何精簡類,如何裁剪專案。