客戶端發起了一條HTTP請求。。
服務器接受,解析,構造header,從web應用那裏拿HTML文檔,構造HTTP響應,發送響應。。
客戶端接受,抽取HTML文檔,顯示。完畢。
太麻煩了,這麼多的細節,在開發過程中,我們關注的只是HTTP請求以及對應的HTML文檔啊,當然是選擇把精力花在這裏啦。所以,抽象吧,把服務器與web應用的通信細節包裝起來,以後就可以不用去管他們啦!!
python中,這個抽象就是WSGI接口,即web server gateway interface. 官方解釋爲:Web服務器軟件和用Python編寫的Web應用程序之間的標準接口。【1】
嗯, 它長這個樣子:(對, 這個接口是一個可調用的對象,一個函數或類)
下面以函數爲例:
def hello_world_app(environ, start_response):
status = '200 OK' # HTTP Status
headers = [('Content-type', 'text/plain; charset=utf-8')] # HTTP Headers
start_response(status, headers)
# The returned object is going to be printed
return [b"Hello World"]
好了,上面的environ就是關於HTTP請求信息的環境變量,dict對象。
start_respond函數發送響應頭部,包括響應碼,顯然,其不可以單獨發送,必須等待程序處理HTML文檔之後才發送。關於具體的參數與使用見:https://www.python.org/dev/peps/pep-3333/#the-start-response-callable
等等,兩個參數由誰提供,還有,誰來調用?當然是服務器啦,看那個函數,其中web應用已經提供了HTML文檔了,就是b"Hello World",它又是一個接口,那差的肯定就是服務器啦。
給它一個 服務器環境,python標準庫的wsgiref,然後這樣做,
from wsgiref.simple_server import make_server
httpd = make_server('', 8000, hello_world_app)
print("Serving on port 8000...")
# Serve until process is killed
httpd.serve_forever()
運行,打開http://localhost:8000
一個小的web應用搞成了。就是說,接下來,我們僅需專注與那個接口對象就行了。
這就是wsgi簡單介紹。
參考: