Flask源码解读尝试(一)

这篇博客是作者学习Flask框架源码的初步尝试,主要探讨了Flask如何使用栈管理HTTP请求,而非队列。文中解释了栈的先进后出特性在处理请求时的优势,并介绍了`threading.local`如何解决多线程中全局变量的问题,确保线程安全。此外,文章还讨论了Flask中上下文的概念,以及如何通过RequestContext和LocalProxy来处理请求数据。
摘要由CSDN通过智能技术生成

本着对框架学习的心,我尝试解读一下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<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值