1. 程式人生 > >Django之HttpServer伺服器分析詳解

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

        包與類的關係結構圖

        wKioL1PaT_yQkwcAAARzWZaW0XM617.jpg

  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包提供應用層的實現。

        包示意圖

wKiom1PaRXHzXdQHAAJ9cEWgaYw589.jpg

 從上圖看來,可能會對包的結構有一個更加直觀的瞭解。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的監聽及處理當作兩個用例來處理,由此可以得出針對這兩種不同用例的時序圖,如下所示:

        類的靜態圖

wKioL1PaRu-wDfnqAAcbd7KnyAU283.jpg

 類的時序圖

            伺服器執行時序圖

wKiom1PaRguDbq_MAAG_egDVqrg776.jpg

處理請求時序圖

wKiom1PaRirBpxN8AAGy3n2JXiQ585.jpg

至此,我們建立了Django框架中自帶HttpServer的設計模型,有了設計模型,我們可以通過它反推出分析模型。如果我們以移植為目的(如需要做一個JAVA版的HttpServer),可以在得到分析模型後,再開始針對JAVA進行設計建模,然後進行程式碼編寫。如果以優化裁剪為目的,我認為推匯出設計模型已經足夠了,可以開始思考如何精簡類,如何裁剪專案。