从0开始学习quantum之2:WSGI协议

先不理解WSGI是什么,只需要知道WSGI使得基于Python的web开发趋向统一。


目前主流的开发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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值