WSGI是Web Service Gateway Interface的縮寫。以層的角度來看,WSGI所在層的位置低於CGI。但與CGI不一樣的是WSGI具備很強的伸縮性且能運行於多線程或多進程的環境下。PEP3333中有對WSGI的描述。python
首先看下Python中的wsgiref包含的模塊:服務器
validate:提供一個驗證,用於驗證是否符合WSGI標準多線程
simple_server:一箇中間服務器用於處理服務器和應用之間的信息傳輸app
handler:服務器和網關直接的執行句柄函數
+ -headers:HTTP頭的相關定義url
util:url和環境的配置spa
其次看下各個模塊對應的運行分析:線程
headers:code
對HTTP頭的相應部分的頭部進行組合,這裏是headers中的相應的操做。server
util
這裏定義的是一個FileWrapper類和URL相關的函數以及與環境配置相關的函數
validate
這裏主要是經過validator調用warpper和check來進行WSGI的相應的檢測工做
simple_server
這裏WSGIServer類繼承自HTTPServer,WSGIRequestHandler類繼承自BaseHTTPRequestHandler,ServerHandler繼承自handler包中的SimpleHandler類
以後demo_app函數代碼:
def demo_app(environ,start_response): from StringIO import StringIO stdout = StringIO() print >>stdout, "Hello world!" print >>stdout h = environ.items(); h.sort() for k,v in h: print >>stdout, k,'=', repr(v) start_response("200 OK", [('Content-Type','text/plain')]) return [stdout.getvalue()]
函數傳入兩個參數,environ字典和start_response是一個調用函數
make_server函數代碼:
def make_server( host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler ): """Create a new WSGI server listening on `host` and `port` for `app`""" server = server_class((host, port), handler_class) server.set_app(app) return server
函數須要(主機名,端口號),處理請求的handle類,已經須要調用以前寫好的app。set_app 設置了 app,它會在 handler_class (默認爲WSGIRequestHandler)的handle函數中被取出來,而後交給 handler 的 run 函數運行。
handler
這裏SimpleHandler繼承自BaseHandler類,BaseCGIHandler繼承自SimpleHandler類,CGIHandler繼承自BaseCGIHandler