PEP-0333 -- Python Web Server Gateway Interface v1.0
說明
WSGI是一種規(guī)范冤寿,描述web server和web application通信的規(guī)范。要實現(xiàn)WSGI協(xié)議,必須同時實現(xiàn)web server和web application反镇。WSGI
的目的就是規(guī)范Web服務器和應用(框架)之間的交互劳景。
WSGI 規(guī)定每個 python 程序(Application)必須是一個可調用的對象(實現(xiàn)了call 函數(shù)的方法或者類)巷嚣,接受兩個參數(shù) environ(WSGI 的環(huán)境信息) 和 start_response(開始響應請求的函數(shù))费什,并且返回 iterable。
幾點說明:
- environ 和 start_response 由 http server 提供并實現(xiàn)
- environ 變量是包含了環(huán)境信息的字典
- Application 內部在返回前調用 start_response
- start_response也是一個 callable翘鸭,接受兩個必須的參數(shù)滴铅,status(HTTP狀態(tài))和 response_headers(響應消息的頭)
- 可調用對象要返回一個值,這個值是可迭代的就乓。
應用汉匙,服務器拱烁,中間件
-
application
:可以被調用的一個對象,一般指包含__call__
方法對象 -
server
:指實現(xiàn)了調用應用的部分 -
middleware
:處于服務器和應用兩側盹兢,起粘合作用邻梆,具體包括:請求處理,響應绎秒,environ
處理等
WSGI environ 變量
-
REQUEST_METHOD
:HTTP請求類型浦妄,例如GET或POST -
SCRIPT_NAME
:URL請求中路徑開始的部分,對應應用程序對象(?) -
PATH_INFO
:URL請求路徑剩余部分见芹,指定請求目標在應用程序內部的虛擬位置(?) -
QUERY_STRING
:URL請求跟在(?)的部分剂娄,可為空或不存在 -
CONTENT_TYPE
:HTTP請求中任何Content-Type域的內容,可為空或不存在 -
CONTENT_LENGTH
:HTTP請求中任何Content-Length域的內容玄呛,可為空或不存在 -
SERVER_NAME
,SERVER_PORT
SERVER_PROTOCOL
Example:
>>> from webob import Request
>>> from pprint import pprint
>>> req = Request.blank("/article?id=1")
>>> req
<Request at 0x7f965014e550 GET http://localhost/article?id=1>
>>> pprint(req.environ)
{'HTTP_HOST': 'localhost:80',
'PATH_INFO': '/article',
'QUERY_STRING': 'id=1',
'REQUEST_METHOD': 'GET',
'SCRIPT_NAME': '',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.0',
'wsgi.errors': <open file '<stderr>', mode 'w' at 0x7f96529cf1e0>,
'wsgi.input': <_io.BytesIO object at 0x7f965013db30>,
'wsgi.multiprocess': False,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 0)}
wsgiref+Webob+Routs+Paste+PasteDeploy
wsgiref 是實現(xiàn)wsgi
規(guī)范的模塊阅懦,提供了操作WSGI
環(huán)境變量和response
頭的工具,并還實現(xiàn)了一個WSGI服務器
Webob 提供了封裝后的WSGI
請求(Request
)環(huán)境徘铝,并輔助創(chuàng)建WSGI
響應(Response
)
Routes 提供是管理URL
路由的模塊
Paste.ini文件解析
- filter:實現(xiàn)一個過濾器中間件
- pipline:把filter串起來
- app:具體的application
- composite:將httpd請求分發(fā)到指定的application