PEP3333指出,WSGI(Web Server Gateway Interface)是WEB服务器和web框架或web应用之间建立的一种简单通用的接口规范。有了wsgi这份接口规范,在web开发的过程中,能更加自由的选择服务器端和框架;在服务器端和框架的开发过程能够分离开来,不用过多的考虑双方具体的实现,使得服务器端和框架开发者能够专心自己领域的开发工作。
WSGI主要由三大部分组成WSGI SERVER、WSGI Middleware 、WSGI Application,他们之间的关系是:wsgi server 接收来自客户端的request请求,封装environ环境变量,给app提供回调函数;调用app,并将environ和回调函数一起传递给app;最后接收来自app的header/status/body响应信息,传给客户端。wsgi Middleware是服务器和应用程序之间的桥梁,中间件同时扮演两种角色,在服务端看来,中间是app能够被调用,在应用程序看来,它是服务端,能够进一步包装需要出来的信息,并将出来的信息传递调用app。应用程序是我们开发程序的主体,必须可调用,必须能够接受服务端传过来的两个参数environ和callback函数。将传入进来的参数,进一步出来生成responce响应信息,传回服务器端。下面是三者的关系图。
实现一个服务端WSGI SERVE:
#!/usr/bin/python #coding=utf-8 def run(application): environ={} #设定环境信息 def start_response(status,headers): #define callback function pass result=application(environ,start_response) #call app pass two parameters def write(data): #访问result iterator object pass for data in result: write(data)
从以上代码可以看出,:server:run是服务端程序,调用可调用应用程序,app。定义一个start_response函数传递给app,作为回调函数。run服务端调用app后,返回一个iterator 迭代对象,将其赋值给result。write()函数在start_response将响应头信息发送后,发送响应body信息。
Middleware
middleware 即是服务端又是应用端。那么就将满足服务端条件:能够配置envion,具有start_response并将其传递给应用程序调用应用程序;应用端条件:可调用,接收两个参数,返回迭代对象。
def dispath(url_app_mapping): def midware_app(envion,start_responce): #callable function url=environ[‘PATH_INFO‘] app=url_app_mapping[url] #get the view function result=app(environ, start_response) #call app return result return midware_app class dispath(): def __init__(self,application): #调用合适的app self.app=application def __call__(self,environ,start_response): #do sometiong return self.app(environ,start_response) #自身可调用
从函数的角度实现的中间件和从类的角度实现的中间件,类的角度实现的中间件更加直观明显。
WSGI application
#!/usr/bin/python #coding=utf-8 def app(environ,start_response): #可调用接收两个参数 status=‘200 ok‘ headers=[(‘Content-type‘,‘text/plain‘)] #设置响应状态码和响应信息 start_response(status,headers) #调用回调函数 return ["hello world"] #返回body 可迭代对象
一个简易的app应用程序,注意返回的body要是一个可迭代对象。