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