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

     

     

     

      

     

      

  • 相关阅读:
    个人阅读2
    代码复审
    PairProject 总结
    Pairproject 移山之道 阅读随笔和一些问题
    M1/M2个人总结
    团队项目个人总结
    个人阅读作业2
    代码互审
    《移山之道》读后感
    Individual Project
  • 原文地址:https://www.cnblogs.com/hyperionworld/p/5336643.html
Copyright © 2020-2023  润新知