Python 中有許多web框架,為了更好讀兼容性段审,python定義了web框架和web服務器之間讀接口,即?PEP-3333(之前的版本是 PEP-333)
WSGI 接口針對兩方面:服務器(網關),和應用(框架)源武。服務器端調用了應用端提供的一個可調用對象限番。
中間件組件其實是兩邊的功能各實現一部分舱污,對服務器來說是應用,對應用來說是服務器弥虐。
callable(可調用)指一個有 __call__ 方法的函數扩灯,方法媚赖,類或實例。
應用對象必須接受兩個位置參數珠插,為了解釋方便一般叫 environ, start_response惧磺,其實叫什么并無所謂。服務器或網關調用應用對象的時候必須有這兩個位置參數捻撑,如result = application(environ, start_response)
environ 是(python內置)字典對象豺妓,包含CGI風格的環(huán)境變量,字典中包含WSGI要求的變量布讹,可能還有服務器相關的變量琳拭。
start_response 接受三個位置變量,兩個必須的status,?response_headers和一個可選的exc_info,像這樣:
????start_response(status, response_headers, exc_info=None)
其中描验,status是一個狀態(tài)字符串白嘁,類似"999 Message here"這種類型。response_headers 是一個list 的?(header_name, header_value)tuples膘流,描述 HTTP 響應header絮缅。start_response 返回一個 ?write(body_data) 可調用,用一個bytestring做位置參數來表示響應的body呼股。
應用對象被服務器調用時會返回一個能產生0或更多 bytestring的迭代器耕魄。
environ 變量
????REQUEST_METHOD非空,表示http方法彭谁,如"GET" 或 "POST"
????SCRIPT_NAME 最初和應用對象對應的部分請求URL的“路徑”
????PATH_INFO 其余的路徑
????QUERY_STRING 請求URL里跟隨? 的部分
????CONTENT_TYPE 吸奴,CONTENT_LENGTH 如其名所指
????SERVER_NAME,?SERVER_PORT 非空
????SERVER_PROTOCOL 請求所用的協(xié)議,如"HTTP/1.0"?或 "HTTP/1.1"缠局,注意回應不必要是相同協(xié)議则奥。
????HTTP_ 變量 客戶端提供的 HTTP_ 開頭的請求頭部