• WERKZEUG中wrappers分析werkzeug简要总结


    BaseRequest是一个基类,对底层的environ进一步包装,实例对象是一个只读的对象,所以说不可变

     def __init__(self, environ, populate_request=True, shallow=False):
            self.environ = environ                                                                                                                               #接受environ初始化
            if populate_request and not shallow:
                self.environ['werkzeug.request'] = self
            self.shallow = shallow
    

    构造方法接受environ,当shallow为False时,在environ中创建request键并将self传入进去。

     @classmethod
     def application(cls, f):
            def application(*args):
                request = cls(args[-2])
                with request:                                                                                                                                                   #request实现了__enter__方法 
                    return f(*args[:-2] + (request,))(*args[-2:])
            return update_wrapper(application, f)                                                                                                          #回调函数
    

    这里classmethod方法允许子类调用该方法,生成一个接收request作为参数的函数,返回一个可调用的wsgi类的响应函数。request的其他方法大多是对environ中的元素进行操作。

    response

    response类是一个WSGI类型的app.
    方法主要包括设置响应码,获得environ中的信息并进行加工,生成内容。

    def __call__(self, environ, start_response):
            app_iter, status, headers = self.get_wsgi_response(environ)
            start_response(status, headers)                                                                                            #生成响应头和响应码
            return app_iter                                                                                         #返回可迭代对象
    
     def get_wsgi_response(self, environ):                                                                 #__call__方法的调用方法
            headers = self.get_wsgi_headers(environ)                                                                   #获得响应头
            app_iter = self.get_app_iter(environ)                                                              #获得可迭代对象
            return app_iter, self.status, headers.to_wsgi_list() 
    

    以上源码是response生成响应的顺序。

    除了以上两个基本的BaseRequestBaseReponse.这个模块中用到了MIXin能够扩展基类的功能,属于动态继承,Mixin类不可以作为基类。在使用多个MIXIN的时候要注意类的MRO规则。
    Mixin方法还是不太懂,参考:
    http://m.blog.chinaunix.net/uid-20687780-id-3455411.html
    http://www.linuxjournal.com/node/4540/print
    https://www.ianlewis.org/en/mixins-and-python
    http://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful

    WSGI的学习总结:

    WSGI是一个工具集合,包括很多对请求和响应的处理模块,其中datastructures是数据结构模块,用于生成特定的数据类型;http模块处理针对http协议中的数据;url模块用于处理URL路径;local模块实现线程隔离;routing模块是一个路由系统;wrapper模块处理最终的请求和生成最终的响应,可以说处于werkzeug结构的顶层。另外还包括一些测试模块比方说服务器script客户端以及test模块。
    通过阅读源码,更深刻的理解了http协议、wsgi协议以及请求响应的流程。接下来阅读flask源码。
    下了个Retext,写东西方便了,但是注释还是很丑陋。

  • 相关阅读:
    centos的DNS服务工作流程及搭建
    将博客搬至CSDN
    全自动网络安装centos(一)安装前准备工作
    网站私有CA证书制作
    LINUX之启动流程
    脚本判断选择语句常用命令
    linux 常用端口
    linux之网卡绑定
    centos7 无法启动网络(service network restart)错误解决办法(转)
    Linux的磁盘配额详解(Quota)
  • 原文地址:https://www.cnblogs.com/hyperionworld/p/5380259.html
Copyright © 2020-2023  润新知