wsgiref源碼學習

        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

相關文章
相關標籤/搜索