一文讀懂Python web框架和web服務(wù)器之間的關(guān)系
我們都知道 Python 作為一門強大的語言,能夠適應(yīng)快速原型和較大項目的制作,因此被廣泛用于 web 應(yīng)用程序的開發(fā)中。
在面試的過程中,大家或多或少都被問到過這樣一個問題:一個請求從瀏覽器發(fā)出到數(shù)據(jù)返回都經(jīng)歷過哪些過程?
要回答這個問題,首先你需要對 HTTP 協(xié)議、web框架、服務(wù)器等底層知識有一定的儲備量,同時需要對 web 框架和服務(wù)器之間的關(guān)聯(lián)有一定的了解,這里有張圖上面詳細的標明它們之間的聯(lián)系。
這么多 wsgi 是不是有點懵逼?看不明白沒有關(guān)系,下面我會帶大家順著圖片里面的順序一步一步來搞懂里面的概念,厘清它們之間的關(guān)系
一、web 框架
在 Python 有很多 web 框架,其中常見的像 Django、Flask、Tornado 、sanic 等,可能有些人對 sanic 不是很熟悉,這里簡單說幾句,它的用法和 Flask 很相似,但是它支持 async/await 異步并發(fā)編程,所以相對來說性能更高。這里就不對這些框架作比較了,因為這不是我們今天的重點!
熟悉的朋友都知道 Web 框架包含一系列庫和一個主要的處理器 (handler),這樣你就能夠構(gòu)建自己的代碼來實現(xiàn) Web 應(yīng)用 (比如說一個交互式的網(wǎng)站)。大多數(shù) web 框架包含模式和工具,能實現(xiàn)以下功能:
URL 路由
將輸入的 HTTP 請求匹配到特定的路由函數(shù),通過路由函數(shù)來調(diào)用對應(yīng)的 Python 代碼
請求和響應(yīng)對象
Python 中的大多的 web 框架都幫我們封裝好了來自用戶發(fā)送的 HTTP 請求 Request,同時也提供了發(fā)送給用戶瀏覽器的 Response 對象
模板引擎
能夠?qū)崿F(xiàn)應(yīng)用的 Python 代碼邏輯和其要產(chǎn)生輸出的 HTML (或其他的) 分離開,例如比較知名的 Jinja2 模板引擎。它使用基于文本的模板語言,因此可以用來生成任何類型的標記,而不僅僅是 HTML。它允許定制過濾器、標簽、測試和全局變量
Web 服務(wù)開發(fā)
除了上述之外,單單一個 web 框架并不能支撐我們應(yīng)用上的服務(wù),需要在開發(fā)機上運行 HTTP 服務(wù)器,從而快速開發(fā);這就需要涉及到 web 框架和服務(wù)器之間的通信等問題。
好在 Python 給我們提供了這樣的協(xié)議接口,也就是我們常說的 WSGI 協(xié)議!下面來了解一下什么是 WSGI 。
二、WSGI協(xié)議
Web 服務(wù)網(wǎng)關(guān)接口 (簡稱為 "WSGI") 是一種在 Web 服務(wù)器和 Python Web 應(yīng)用程序框架之間的標準接口。通過標準化 Web 服務(wù)器和 Python web 應(yīng)用程序框架之間的行為和通信,WSGI 使得編寫可移植的的 Python web 代碼變?yōu)榭赡埽蛊淠軌虿渴鹪谌魏畏?WSGI 的 web 服務(wù)。
有了 WSGI 協(xié)議,我們就不需要為每一個 web 框架去搞一套協(xié)議,因為基本上所有的Python web 框架都支持這個協(xié)議。
三、uWSGI服務(wù)器
uWSGI 服務(wù)器也就是圖片中的所指的 WSGI 容器, 獨立 uWSGI 服務(wù)器相比傳統(tǒng) web 服務(wù)器,使用更少的資源,并提供比較高的性能 。Python 中的 uWSGI 服務(wù)器應(yīng)用最廣的主要包含以下幾個:
Gunicorn
Gunicorn (Green Unicorn,綠色獨角獸) 是一個純 Python WSGI 服務(wù)器,用來支持 Python 應(yīng)用。不像其他 Python web 服務(wù)器,它有周全的用戶界面,十分易于使用和配置。
Gunicorn 具有合理的默認配置。然而,其他一些像 uWSGI 這樣的服務(wù)器相較而言過于可定制化,因此更加難以高效使用。
Gunicorn 是如今新 Python web 應(yīng)用程序的推薦選擇。
Waitress
Waitress 是一個純 Python WSGI 服務(wù)器,聲稱具備 “非常高效的性能”。它的文檔不是很詳細,但它確實提供了一些很好的而 Gunicorn 沒有的功能(例如 HTTP 請求緩沖)。
Waitress 在 Python Web 開發(fā)社區(qū)中越來越受歡迎。
uWSGI
你沒有看錯,又是 uWSGI!uWSGI 用來構(gòu)建全棧式的主機服務(wù)。除了進程管理、進程監(jiān)控和其他功能外, uWSGI 也能作為一個應(yīng)用服務(wù)器,適用于多種編程語言和協(xié)議 - 包括 Python 和 WSIG。uWSGI 既能當(dāng)作獨立的 web 路由器來運行,也能運行在一個完整 web 服務(wù)器(比如 Nginx 或 Apache )之后。對于后者,web 服務(wù)器可以基于 uwsgi 協(xié)議 配置 uWSGI 和應(yīng)用的操作。uWSGI 的 web 服務(wù)器支持允許動態(tài)配置 Python 、傳遞環(huán)境變量等。
四、uwsgi 協(xié)議
uwsgi 協(xié)議:與 WSGI 一樣是一種通信協(xié)議,它是 web 服務(wù)器 和 uWSGI 服務(wù)器之間的協(xié)議,一個 uWSGI 服務(wù)器的獨占協(xié)議,它是用于定義傳輸信息的類型(type of information),每一個 uwsgi packet前4byte為傳輸信息類型的描述,與 WSGI協(xié)議 是兩種東西。
五、Web 服務(wù)器端
Web 服務(wù)器包括 Nginx,Apache,IIS 等。而優(yōu)秀的 web 服務(wù)器在接收 http 請求時,還可以做負載均衡和反向代理等工作。
Nginx
Nginx 是一個 web 服務(wù)器,并且是 HTTP 、SMTP 和其他協(xié)議的反向代理。它由其高性能、相對簡潔以及對眾多應(yīng)用服務(wù)器 (比如 WSGI 服務(wù)器) 兼容而著名。
它也擁有便利的特性, 比如負載均衡、基本的認證、流等。Nginx 被設(shè)計為承載高負載的網(wǎng)站,并逐漸變得廣為流行。所以我們一般用 Nginx來做還可以做負載均衡和反向代理!
當(dāng)然除了厘清以上的概念及它們之間的關(guān)系之外,您還需要知道 HTTP 協(xié)議的知識,這部分也是在面試中經(jīng)常被問到的,這里就不做贅述了。