CGI WSGI

CGI(Common Gateway Interface)

如果客戶端的需求只是靜態文件(比如靜態 html), 那么服務器只需要把靜態文件傳送給客戶端就行了.
但事實上需求多種多樣, 我們需要由程序動態生成的內容. 我們當然可以把這部分功能結合在 web服務器里, 但這樣一來隨著需求日益增多, 服務器程序很快就無法維護了...
因此 web 服務器只保留最基本功能(解析http請求等), 而把具體對資源的處理放入另外的程序.這些程序根據CGI(協議)從環境變量或標準輸入得到請求信息, 并通過標準輸出返回給服務器.
但這種分離的壞處是每次CGI請求都會運行CGI程序(產生新的進程), 結束時銷毀, 增加負荷, 效率不高.因為每個 CGI 進程只處理一個請求,換句話說,每個請求都需要創建一個 CGI 進程處理,CGI 程序處理完畢后就退出了。

對一個 CGI 程序,做的工作其實只有:從環境變量(environment variables)和標準輸入(standard input)中讀取數據、處理數據、向標準輸出(standard output)輸出數據。

WSGI(Python Web Server Gateway Interface,縮寫為WSGI)

WSGI只是一份標準,一個兩邊接口方式的約定(Web服務器與Web應用程序之間)
WSGI更像一個協議。只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行
一個符合wsgi規范的web server,接收request請求,封裝一系列環境變量,按照wsgi規范調用注冊的wsgi app,最后將response返回給客戶端。
WSGI將 web 組件分為三類: web服務器,web中間件,web應用程序, wsgi基本處理模式為 : WSGI Server -> (WSGI Middleware)* -> WSGI Application 。

WSGI 與 CGI 類似, 不過不是另外開辟一個進程, 而是調用一個 WSGI 程序(callable 對象), 其中 environ 變量(包含請求參數信息), start_response (作為回調函數使用, 讓 WSGI 程序可以設置響應頭部, 更加靈活) 作為參數.
WSGI 流程大概下面這個樣子:
服務器啟動加載一個 WSGI 程序(callable 對象, 可能由框架提供)
服務器建立連接,讀取請求并解析, 然后創建一個 environ 字典, 服務器程序還會實現一個 start_response 方法, 用于在應用內部更改響應頭部
服務器將 environ 和 start_response 作為參數, 調用 WSGI 程序, 并得到返回的數據
服務器將得到的數據和由 start_response(WSGI 程序內部調用) 設置的響應頭部來構造 HTTP 響應, 并返回給客戶端

參考:https://www.biaodianfu.com/cgi-fastcgi-wsgi.html
http://www.lxweimin.com/p/4cea972770f4

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容