本着对框架学习的心,我尝试解读一下FLask框架的源码,不过这种东西并非我这种菜鸟能轻易理解的,所以打算分成好几篇博客来记录自己学习到的东西。
第一篇先记录下自己所学习到的一些源码里的个别函数以及对上下文的管理机制。
栈
Flask源码里对http请求报文的存储方式为栈。
只要学习过数据结构的大家都清楚,栈是先进后出,最先进去的数据压在最下面,最后进去的数据在顶部,取数据时从顶部依次往下取。
所以我自己就想着用list实现一个简单的栈的结构。
class Stack():
def __init__(self,size):
self.size=size
self.stack=[]
self.top=-1
def push(self,x):
if self.isfull():
raise exception("stack is full")
else:
self.stack.append(x)
self.top=self.top+1
def pop(self):
if self.isempty():
raise exception("stack is empty")
else:
self.top=self.top-1
self.stack.pop()
def isfull(self):
return self.top+1 == self.size
def isempty(self):
return self.top == '-1'
def showStack(self):
print(self.stack)
本着先进后出的原理,这里将top属性设置为-1,然后每往里面加入一个数据,便给top+1,这样的话就能始终保持top是最后一个加入的数据的索引,也是栈顶的索引。删除数据时,便将top-1,接着给一个pop操作,不传入参数时便默认删除最后一个数据,这便将数据从栈里“弹”出去了。判断长度时也是用top属性+1和传入的size比较,可以判断数据的长度是否合乎要求。
栈实现起来并不难,原理也比较好理解,在Flask里将请求报文压栈之前,还要给该请求信息加一些上下文的数据,加完之后无论是在栈里还是从栈里读取出来,都是比较好处理的。
队列
和栈恰恰相反的就是队列,为什么Flask里不用队列而用栈呢,就是因为队列就像我们去火车站排队进站一样,谁先来谁就排在前面,到谁了,就把谁释放掉。我个人猜想就是因为这样不太方便请求信息的处理,所以Flask里才运用了栈而不用队列的原因。
简单的队列也比较容易实现,我还是一样,用list实现了较为简单的队列。
class Queue<