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包含有以下模塊:
- simple_server模塊 ——simple_server模塊實現了可以運行單個WSGI應用的簡單的HTTP服務器。
- headers模塊 ——管理響應首部的模塊。
- handlers模塊 ——符合WSGI標準的Web服務網關接口實現。該模塊包含了一些處理程序對象,用來設置WSGI執行環境,以便應用程序能夠在其他的Web服務器中運行。
- validate模塊 ——“驗證包裝”模塊,確保應用程序和服務器都能夠按照WSGI標準進行操作。
- util模塊 ——一些有用的工具集
- 邏輯流程
- 服務器創建socket,監聽端口,等待客戶端連接。
- 當有請求來時,服務器解析客戶端信息放到環境變量environ中,並調用綁定的handler來處理請求。
- handler解析這個http請求,將請求信息例如method,path等放到environ中。
- wsgi handler再將一些服務器端信息也放到environ中,最後服務器信息,客戶端信息,本次請求信息全部都保存到了環境變量environ中。
- wsgi handler 調用註冊的wsgi app,並將environ和回調函數傳給wsgi app
- wsgi app 將reponse header/status/body 回傳給wsgi handler
- 最終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