WSGI介绍

RESTful只是设计风格而不是标准,Web服务中通常使用基于HTTP的符合RESTful风格的API。而WSGI(Web Server Gateway Interface,Web服务器网关接口)则是Python语言所定义Web服务器和Web应用程序或框架之间的通用接口标准。
从名称上看,WSGI是一个网关,作用就是在协议之间进行转换。换句话说,WSGI就是一座桥梁,桥梁的一端称为服务端或网关端,另一端称为应用端或框架端。当处理一个WSGI请求时,服务端为应用端提供上下文信息和一个回调函数,应用端处理完请求后,使用服务端所提供的回调函数返回相对应请求的响应。
作为一个桥梁,WSGI将web组件分为了三类:Web服务器(WSGI Server)、Web中间件(WSGI Middleware)与Web应用程序(WSGI Application)。WSGI Server接收HTTP请求,封装一系列环境变量,按照WSGI接口标准调用注册的WSGI Application,最后将响应返回给客户端。
一 WSGI Application
WSGI Application是一个可被调用(Callable)Python对象,它接受两个参数,通常为environ和start_response.
举例:
def application(environ,start_response):
#发送了HTTP响应的Header
    start_response('200 OK',[('Content-Type','text/html')])
    #作为HTTP响应的Body发送给浏览器
    return '<h1>Hello,web!</h1>'
参数environ指向一个python字典,要求里面至少包含了一些在CGI(通过网关接口规范)中定义的环境变量,比如REQUEST_METHOD、SCRIPT_NAME、PATH_INFO、QUERY_STRING等,除此之外,environ里面至少要包含7个WSGI所定义的环境变量,比如wsgi.version、wsgi_input、wsgi_scheme等。WSGI应用可以从environ字典获取相应的请求及其执行上下文的所有信息。
参数start_response指向一个回调函数,形如:
start_response(status,response_headers,exc_info=None)
第一个参数:HTTP响应码
第二个参数:一组元祖列表list表示的HTTP Header,每个Header用一个包含两个str的tuple表示。
二 WSGI Server
每当收到 HTTP 请求,server/gateway 必须调用 callable object,过程如下
1 接收 HTTP 请求,但是不关心 HTTP url, HTTP method 等
2 为 environ 提供必要的参数,实现一个回调函数 start_response,并传给 callable object
3 调用 callable object
详细过程:
1. `服务器创建socket`,监听端口,等待客户端连接。
2. 当有请求来时,`服务器`解析客户端信息放到环境变量`environ`中,并调用绑定的`handler`来处理请求。
3. handler解析这个http请求,将请求信息例如method,path等放到`environ`中。
4. wsgi handler再将一些服务器端信息也放到`environ`中,最后服务器信息,客户端信息,本次请求信息全部都保存到了环境变量environ中。
5. wsgi handler 调用注册的`wsgi app`,并将environ和回调函数传给wsgi app
6. wsgi app 将reponse header/status/body 回传给wsgi handler
7. 最终handler还是通过socket将response信息塞回给客户端。
举例:
编写一个server.py,负责启动WSGI服务器,加载application()函数:
#server.py
#从wsgi中模块中导入
from wsgiref.simple_server import make_server
#导入我们自己编写的application函数
from hello import application
#创建一个服务器,IP的值为空,端口号8000,处理函数是application
httpd = make_server('',8000,application)
print "Serving HTTP on port 8000..."
#开始监听HTTP请求
httpd.server_forever()
三 WSGI Middleware
middleware
另外,有些功能可能介于服务器程序和应用程序之间,例如,服务器拿到了客户端请求的URL, 不同的URL需要交由不同的函数处理,这个功能叫做 URL Routing,这个功能就可以放在二者中间实现,这个中间层就是 middleware。
middleware对服务器程序和应用是透明的,也就是说,服务器程序以为它就是应用程序,而应用程序以为它就是服务器。这就告诉我们,middleware需要把自己伪装成一个服务器,接受应用程序,调用它,同时middleware还需要把自己伪装成一个应用程序,传给服务器程序。
其实无论是服务器程序,middleware 还是应用程序,都在服务端,为客户端提供服务,之所以把他们抽象成不同层,就是为了控制复杂度,使得每一次都不太复杂,各司其职。
下面,我们看看middleware大概是什么样子的。
# URL Routing middleware
def urlrouting(url_app_mapping):
    def midware_app(environ, start_response):
        url = environ['PATH_INFO']
        app = url_app_mapping[url]
        result = app(environ, start_response)
        return result
    return midware_app
函数 midware_app就是一个简单的middleware:对服务器而言,它是一个应用程序,是一个可调用对象, 有两个参数,返回一个可调用对象。对应用程序而言,它是一个服务器,为应用程序提供了参数,并且调用了应用程序。
另外,这里的urlrouting函数,相当于一个函数生成器,你给它不同的 url-app 映射关系,它会生成相应的具有 url routing功能的 middleware。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值