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,写东西方便了,但是注释还是很丑陋。

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