1. 程式人生 > >Python3 之 Web 框架:web框架的本質

Python3 之 Web 框架:web框架的本質

但是 hub ima sgi 控制器 borde http ace esp

各位,學Python 的同誌,相信對 Django 、Flask、等不會陌生,這些就是Python語言的web 框架。

那麽問題來了,web 服務器又是什麽,他和web框架有什麽關系?他們又是如何工作的,分別處於什麽位置?還有有時候有人會把HTTP服務器叫做web服務器,這是為何?這種說法對嗎?帶著這些疑問,聽我慢慢道來…

一、什麽是 Web 服務器

平時我們都是通過瀏覽器(比如Chrome,Firefox等)上網的,當我們在瀏覽器的地址欄裏輸入地址後,會得到一個網頁。

這個網頁就是 web 服務器返回給我們的,而瀏覽器就稱為客戶端,當我們輸入網址並按下回車後,就像web服務器發送了一個web請求。

這種模式成為 B/S 模式 ,即 Browse / Server 模式

在瀏覽器中輸入地址、按回車後,按下F12 就是看到如下信息

技術分享

下面就讓我們來目睹整個過程吧

技術分享

  1. 建立連接:客戶機通過TCP/IP協議建立到服務器的TCP連接。
  2. 請求過程:客戶端向服務器發送HTTP協議請求包(Request),請求服務器裏的資源文檔。
  3. 應答過程:服務器向客戶機發送HTTP協議應答包(Response),如果請求的資源包含有動態語言的內容,那麽服務器會調用動態語言的解釋引擎負責處理“動態內容”,並將處理得到的數據返回給客戶端。由客戶端解釋HTML文檔,在客戶端屏幕上渲染圖形結果。
  4. 關閉連接:客戶機與服務器斷開。

這裏Request 和 Response 都需要遵守 HTTP 協議,關於 HTTP 協議的詳細內容,可以讀讀《HTTP 權威指南

但是實際中的 Web 服務器遠遠比上面示例的復雜的多,因為要考慮的因素實在是太多了,比如:

  • 緩存機制:講一些經常被訪問的頁面緩存起來,提高響應速度;
  • 安全:防止黑客的各種攻擊,比如 SYN Flood 攻擊;
  • 並發處理:如何響應不同客戶端同時發起的請求;
  • 日誌:記錄訪問日至,方便做一些分析。

目前在UNIX和LINUX平臺下使用最廣泛的免費 Web 服務器有Apache和 Nginx 。而這些軟件都是遵循遵守 HTTP 協議的。

所以可以稱他們為HTTP服務器,只是可以通過HTTP協議語言的解析轉換。

Web 應用程序

Web 服務器接受 Http Request,返回 Response,很多時候 Response 並不是靜態文件,因此需要有一個應用程序根據 Request 生成相應的 Response。這裏的應用程序主要用來處理相關業務邏輯,讀取或者更新數據庫,根據不同 Request 返回相應的 Response。註意這裏並不是 Web 服務器本身來做這件事,它只負責 Http 協議層面和一些諸如並發處理,安全,日誌等相關的事情。

應用程序可以用各種語言編寫(Java, PHP, Python, Ruby等),這個應用程序會從Web服務器接收客戶端的請求,處理完成後,再返回響應給Web服務器,最後由Web服務器返回給客戶端。整個架構如下:

技術分享

對於所有的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。

Web 框架(framework)

框架,即framework,特指為解決一個開放性問題而設計的具有一定約束性的支撐結構,使用框架可以幫你快速開發特定的系統,簡單地說,就是你用別人搭建好的舞臺來做表演。

以 python web 框架 flask 為例,框架本身並不限定我們用哪種架構來組織我們的應用,不過其中一種比較經典的Web框架 Flask 采用了 MVC 架構,可以很好地支持以 MVC 方式組織應用。

  1. 用戶輸入 URL,客戶端發送請求
  2. 控制器(Controller)首先會拿到請求
  3. 然後用模型(Models)從數據庫取出所有需要的數據,進行必要的處理,將處理後的結果發送給 視圖(View)
  4. 視圖利用獲取到的數據,進行渲染生成 Html Response返回給客戶端。

如下圖所示:

技術分享

還有一種同樣熱門且強大的 Web 框架: Django

它的模式是:MTV

Django的MTV模式本質是各組件之間為了保持松耦合關系,Django的MTV分別代表:

  • Model(模型):負責業務對象與數據庫的對象(ORM)
  • Template(模版):負責如何把頁面展示給用戶
  • View(視圖):負責業務邏輯,並在適當的時候調用Model和Template

此外,Django還有一個url分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template

技術分享

Web 服務器網關接口

我們知道Python有著許多的 Web 框架,而同時又有著許多的 Web 服務器(Apache, Nginx, Gunicorn等),框架和Web服務器之間需要進行通信,如果在設計時它們之間不可以相互匹配的,那麽選擇了一個框架就會限制對 Web 服務器的選擇,這顯然是不合理的。

那麽,怎樣確保可以在不修改Web服務器代碼或網絡框架代碼的前提下,使用自己選擇的服務器,並且匹配多個不同的網絡框架呢?答案是接口,設計一套雙方都遵守的接口就可以了。對python來說,就是WSGI(Web Server Gateway Interface,Web服務器網關接口)。其他編程語言也擁有類似的接口:例如Java的Servlet API和Ruby的Rack。

Python WSGI的出現,讓開發者可以將 Web 框架與 Web 服務器的選擇分隔開來,不再相互限制。現在,你可以真正地將不同的 Web 服務器與Web框架進行混合搭配,選擇滿足自己需求的組合。例如,可以使用 Gunicorn 或Nginx/uWSGI來運行Django、Flask或web.py應用。

技術分享

總結

技術分享

Web Server 包括 提供 Htttp 服務的軟件,Web 應用程序,後端存儲數據庫

Python3 之 Web 框架:web框架的本質