WSGI 的簡單理解

WSGI是Web Server Gateway Interface(Web服務器網關接口)的縮寫。其位於web應用程序與web服務器之間。
python標準庫提供的獨立WSGI服務器稱爲wsgiref。


1.首先了解一下HTTP協議和HTML文檔,一個Web應用的本質就是:

瀏覽器發送一個HTTP請求;

服務器收到請求,生成一個HTML文檔;

服務器把HTML文檔作爲HTTP響應的Body發送給瀏覽器;

瀏覽器收到HTTP響應,從HTTP Body取出HTML文檔並顯示。

所以,最簡單的Web應用就是先把HTML用文件保存好,用一個現成的HTTP服務器軟件,接收用戶請求,從文件中讀取HTML,返回。Apache、Nginx、Lighttpd等這些常見的靜態服務器就是幹這件事情的。
如果要動態生成HTML,就需要把上述步驟自己來實現。不過,接受HTTP請求、解析HTTP請求、發送HTTP響應都是苦力活,自己實現太耗時間。
因爲我們不希望接觸到TCP連接、HTTP原始請求和響應格式,所以,需要一個統一的接口,讓它來幫助我們實現,我們專心用Python編寫Web業務就可以了。
這個接口就是WSGI。

WSGI接口定義非常簡單,我們只需實現一個方法就可以響應HTTP請求。
例子:
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return '<h1>Hello</h1>'

2.上面的application函數就是符合WSGI標準的一個HTTP處理函數,它接收兩個參數:

1).environ:一個包含所有HTTP請求信息的dict對象

2).start_response:一個發送HTTP響應的函數

在application()函數中:
調用: start_response('200 OK', [('Content-Type', 'text/html')])
就發送了HTTP響應的Header,注意Header只能發送一次,也就是隻能調用一次start_response()函數。
start_response()函數接收兩個參數,一個是HTTP響應碼,一個是一組list表示的HTTP Header,每個Header用一個包含兩個str的tuple表示。
通常情況下,都應該把Content-Type頭髮送給瀏覽器。其他很多常用的HTTP Header也應該發送。

然後,函數的返回值'<h1>Hello</h1>'將作爲HTTP響應的Body發送給瀏覽器。


3.有了WSGI,我們關心的就是如何從environ這個dict對象拿到HTTP請求信息,然後構造HTML,通過start_response()發送Header,最後返回Body。
整個application()函數本身沒有涉及到任何解析HTTP的部分,也就是說,底層代碼不需要我們自己編寫,我們只負責在更高層次上考慮如何響應請求就可以了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章