目前主流的开发WEB的两个平台是J2EE和.NET,这两个平台都有一个共同点,即WEB-SERVER已经由官方开发好,用户只需要实现网站应用就可以了。
以.NET平台为例,Windows系统本身就自带了IIS服务(Internet infomation Service),该服务监听某个端口,接受来自远方HTTP客户端的请求,并转发给相应的APP处理,这里的APP就是我们基于.NET平台开发的网站应用。
也就是说,IIS规范了APP的实现方式,这样IIS才能正确地把HTTP请求转发给APP,不同的开发者都按这样的方式开发网站,达到了平台统一。
然而,python在WSGI出现之前并没有一个统一的WebServer框架,这样就使得一个WEB APP无法在不同的Server下迁移,因为不同的Server有不同的接口规范。
WSGI正是为了统一这样的Server差异产生了。
WSGI的官方定义是,the Python Web Server Gateway Interface,它是Python语言的一个web服务网关协议,目前没有官方实现,但是有很多web服务都已经按照这个协议进行开发了,所以遵守这样协议的Web Server和APP可以相互兼容。
WSGI协议:
web-server要按一定格式组织http请求给webapp,同时web-server要传递一个回调函数给webapp,当webapp处理完成后,调用server的回调函数,并返回处理结果
1、web-server将http请求按一定格式组织发个webapp:web-server收到HTTP请求后,将请求信息,以及当前系统的一些环境变量保存在一个字典(Python的dict类型)environ中。
2、web-server需要给webapp传递一个回调函数,这个回调函数名称叫做start_response
3、webapp为了接收environ和start_response,则需要两个形参
一个webapp的例子:
def webapp(environ, start_response): #webapp需要2个参数接收web-server传递的environ和回调方法
status = '200 OK'
output = 'World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(12)]
write = start_response(status, response_headers)#webapp处理http请求完成后,调用server的回调函数
write('Hello ')
return [output] #返回结果给web-server,结果是一个list
一个web-server的例子:
environ = {} #定义要传递给webapp的环境变量
environ['config-path']='某些web-app需要读取的配置文件的路径'
def start_response(status, response_headers): #定义传递给webapp的回调函数
global res_status
global res_headers
res_status = status
res_headers = response_headers
return xxxxxx
def web_server(): #web-server,监听端口,收到http请求后把environ和start_response方法传递给webapp
server = xxxServer()
server.listen('0.0.0.0',8080)
while True:
http_request = server.accept()
environ['http-request']=http_request
result = webapp(environ,start_response)
server.sendResult(result)#web-app将webapp处理结果返回给客户端
web_server()
在quantum中,实现wsgi协议借助了很多第三方库
例如实现了wsgi中的web-server的是eventlet这个第三方库
而webapp则由一群处理不同请求的方法和对象组成,例如route这个第三方库实现了http的url转发功能,而webob这个第三方库则简化web-server传递的environ和封装了start_response的处理,具体的quantum业务则由我们具体实现。
因此,
eventlet构成了wsgi协议的web-server。route、webob、实现具体业务的app则构成了wsgi协议的webapp。
下一篇介绍eventlet、route、和webob,以及他们如何配合实现wsgi