PEP-0333 -- Python Web Server Gateway Interface v1.0
说明
WSGI是一种规范,描述web server和web application通信的规范。要实现WSGI协议,必须同时实现web server和web application。WSGI
的目的就是规范Web服务器和应用(框架)之间的交互。
WSGI 规定每个 python 程序(Application)必须是一个可调用的对象(实现了call 函数的方法或者类),接受两个参数 environ(WSGI 的环境信息) 和 start_response(开始响应请求的函数),并且返回 iterable。
几点说明:
- environ 和 start_response 由 http server 提供并实现
- environ 变量是包含了环境信息的字典
- Application 内部在返回前调用 start_response
- start_response也是一个 callable,接受两个必须的参数,status(HTTP状态)和 response_headers(响应消息的头)
- 可调用对象要返回一个值,这个值是可迭代的。
应用,服务器,中间件
-
application
:可以被调用的一个对象,一般指包含__call__
方法对象 -
server
:指实现了调用应用的部分 -
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 是实现wsgi
规范的模块,提供了操作WSGI
环境变量和response
头的工具,并还实现了一个WSGI服务器
Webob 提供了封装后的WSGI
请求(Request
)环境,并辅助创建WSGI
响应(Response
)
Routes 提供是管理URL
路由的模块
Paste.ini文件解析
- filter:实现一个过滤器中间件
- pipline:把filter串起来
- app:具体的application
- composite:将httpd请求分发到指定的application
网友评论