![cfc48d98b9452d80e76a3a55ff9c1e18.png](https://i-blog.csdnimg.cn/blog_migrate/72af8e00e54be21ee00d650e6c94170b.jpeg)
写在前面:Flask框架是通过多线程/多进程+阻塞的socket实现非阻塞,其本质是基于python的源库socketserver实现的
- 前言
- 认识WSGI协议
- 认识Werkzeug
- flask是如何实现非阻塞的
本文使用的flask框架为最新的1.1.1版本,所有代码基于python3运行
一:前言
使用过flask或者其他web框架的人应该对web框架这种东西并不陌生,它是通过对一系列包括请求处理、路由分发、session管理甚至网络攻防等各个模块的封装,让使用者可以快速搭建起一个web应用,让开发者可以将更多的精力放在业务逻辑代码的coding上,而不用过多的去对偏底层的部分进行开发。这次,我试着通过《flask框架是如何实现非阻塞并发的》这篇文章加上对flask源码的分析尝试解答以下几个问题:
- flask框架的大体架构是怎样的
- 什么是WSGI协议
- Werkzeug和flask是什么关系,和WSGI又是什么关系
- 非阻塞并发的功能是在flask哪个部分实现的,又是如何实现的
首先我们看一下一个基本的flask应用程序:
import
当我们在浏览器种访问http://127.0.0.1:8088/index的时候,系统会被time.sleep(15)阻塞15秒才能够得到返回,而当在这15秒内我们再次访问http://127.0.0.1:8088访问另外一个路由的时候,"hello world"会立刻返回,说明该请求未被前一个请求阻塞。现在,我们尝试对app.run()之后发生的事情做一个分析。
run()函数位于flask/app.py中的Flask类下,核心代码如下:
def
在run函数内,函数设置了服务启动的address,port等信息,最后引入了一个werkzeug库的run_simple方法,另外还传入了一个options参数。要特别注意的是,options.setdefault("threaded",True)这行代码在最初的flask 0.1系列版本种是不存在的