WERKZEUG之WSGI阅读笔记

    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要是一个可迭代对象。

 

 

 

  

 

  

原文地址:https://www.cnblogs.com/hyperionworld/p/5336643.html