WSGI實現——wsgiref模塊源碼閱讀

WSGI網關接口

  • WSGI (Python Web Server Gateway Interface, Python Web服務器網關接口)是一個Web服務器和Web應用程序之間的標準化接口,用於增進應用程序在不同的Web服務器和框架之間的可移植性。關於該標準的官方說明可以參考PEP333
  • WSGI的主要作用是在Web服務器和Web應用程序承擔“翻譯官”的角色。對於這一角色可以這樣理解:

Web服務器的責任在於監聽和接收請求。在處理請求的時候調用WSGI提供的標準化接口,將請求的信息轉給WSGI;
WSGI的責任在於“中轉”請求和響應信息。WSGI接收到Web服務器提供的請求信息後可以做一些處理,之後通過標準化接口調用Web應用,並將請求信息傳遞給Web應用。同時,WSGI還將會處理Web應用返回的響應信息,並通過服務器返回給客戶端;Web應用的責任在於接收請求信息,並且生成響應。

WSGI規範

  • WSGI規範如下:
  • 服務器的請求處理程序中要調用符合WSGI規範的網關接口;
  • 網關接口調用應用程序,並且要定義start_response(status, headers)函數,用於返回響應;
  • 應用程序中實現一個函數或者一個可調用對象webapp(environ, start_response)。其中environ是環境設置的字典,由服務器和WSGI網關接口設置,start_response是由網關接口定義的函數。

wsgiref包

  • wsgiref包爲實現WSGI標準提供了一個參考,它可以作爲獨立的服務器測試和調試應用程序。在實際的生產環境中儘量不要使用。wsgiref包含有以下模塊:
  1. simple_server模塊 ——simple_server模塊實現了可以運行單個WSGI應用的簡單的HTTP服務器。
  2. headers模塊 ——管理響應首部的模塊。
  3. handlers模塊 ——符合WSGI標準的Web服務網關接口實現。該模塊包含了一些處理程序對象,用來設置WSGI執行環境,以便應用程序能夠在其他的Web服務器中運行。
  4. validate模塊 ——“驗證包裝”模塊,確保應用程序和服務器都能夠按照WSGI標準進行操作。
  5. util模塊 ——一些有用的工具集
    在這裏插入圖片描述
  • 邏輯流程
  1. 服務器創建socket,監聽端口,等待客戶端連接。
  2. 當有請求來時,服務器解析客戶端信息放到環境變量environ中,並調用綁定的handler來處理請求。
  3. handler解析這個http請求,將請求信息例如method,path等放到environ中。
  4. wsgi handler再將一些服務器端信息也放到environ中,最後服務器信息,客戶端信息,本次請求信息全部都保存到了環境變量environ中。
  5. wsgi handler 調用註冊的wsgi app,並將environ和回調函數傳給wsgi app
  6. wsgi app 將reponse header/status/body 回傳給wsgi handler
  7. 最終handler還是通過socket將response信息塞回給客戶端。
    *在這裏插入圖片描述
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()]


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


httpd = make_server('localhost', 8002,  demo_app)
httpd.serve_forever()  # 使用select

參考鏈接

python之wsgiref模塊
Wsgiref 包——符合 WSGI 標準的 Web 服務實現(一)

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