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
生成响应的顺序。
除了以上两个基本的BaseRequest和BaseReponse.这个模块中用到了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,写东西方便了,但是注释还是很丑陋。