從Python看Web架構的發展
靜態web與動態web
在靜態WEB程式中,客戶端使用WEB瀏覽器(IE、FireFox等)經過網路(Network)連線到伺服器上,使用HTTP協議發起一個請求(Request),告訴伺服器我現在需要得到哪個頁面,所有的請求交給WEB伺服器,之後WEB伺服器根據使用者的需要,從檔案系統(存放了所有靜態頁面的磁碟)取出內容。之後通過WEB伺服器返回給客戶端,客戶端接收到內容之後經過瀏覽器渲染解析,得到顯示的效果。
由於這種應用不能與使用者互動、無法顯示個性化的內容,所以動態網頁技術應運而生。
在動態WEB程式中,程式依然使用客戶端和服務端,客戶端依然使用瀏覽器(IE、FireFox等),通過網路(Network)連線到伺服器上,使用HTTP協議發起請求(Request),現在的所有請求都先經過一個WEB Server 來處理,用於區分是請求的是靜態資源還是動態資源。
如果WEB Server 發現客戶端請求的是靜態資源,則WEB伺服器從靜態檔案系統中取出內容,傳送回客戶端瀏覽器進行解析執行。
如果WEB Server 發現客戶端請求的是動態資源,則先將請求轉交給Web應用程式,由Web應用程式組織資料,最後把處理結果交給WEB伺服器,之後通過WEB伺服器將內容傳送回客戶端瀏覽器。
web伺服器與web應用程式的介面
gateway interface 是web server和web應用程式之間的介面規範,這種介面規範規定了web伺服器:
如何將 request 引數化後傳遞給 web應用程式,web應用如何將它的輸出傳送給 webserver,
以及如何呼叫 web應用程式。
CGI、FASTCGI、WSGI都是web伺服器 與 web應用程式的介面規範,如:
web Server + CGI + shell + DB
web Server + FastCGI + shell php + DB
web server + Serverlet + java + MVC
web Server + WSGI + Python + MVC
web應用程式的再抽象
隨著web應用的動態化, 傳統的靜態web server對於動態內容無能為力,CGI技術用於生成動態內容。 但是CGI技術的效能很差, 主要是因為對於每個請求都要建立一個程序來執行cgi程式, 而程序建立的開銷比較大, 嚴重拖慢了響應速度。隨後fastcgi技術出現了, 為了解決cgi技術中存在的問題,fastcgi
uWSGI是一個WSGI協議的實現,包括四個部分:
實現了 uwsgi協議, 與web server 通訊
web server 內建支援協議模組:
application server協議支援模組: 實現了 WSGI, 與 python框架互動
程序控制程式: 為web request 的處理建立工作程序
為什麼要隔離 framework 和webserver?
https://www.98891.com/article-33-1.html
如果在nginx中直接用WSGI, 那麼 nginx執行緒中就要啟動python直譯器。通常最好在與主Web伺服器不同的程序中執行Python。 這樣,Web伺服器可以具有許多微小的執行緒,這些執行緒可以非常快地提供靜態內容,而單獨的Python程序又大又笨重,並且每個程序都在執行自己的Python直譯器。
更靈活。開發人員可以從Green Unicorn切換到uWSGI,而無需修改實現WSGI的應用程式或框架。
易於擴充套件。一次為成千上萬個動態內容的請求提供服務是WSGI伺服器的任務,而不是框架,職責分離對於有效地擴充套件和分派Web流量很重要。
web框架
Web框架的作用主要是方便我們開發 web應用程式,HTTP請求的動態資料就是由 web框架層來提供的。沒有框架時,實現業務邏輯要面對如何設計路由邏輯,資料如何訪問, 檢視如何設計等問題。
以MVC開發模式來說, 我們要實現MVC 這三個方面的各種細節。 每次開發一個新的app都有大量重複的工作要做。 這些重複的固定的工作與流程被抽象出來,每次只用開發相應的業務邏輯, 大大加快了web開發的速度。