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