Flask 的整体流程
Flask 的整体流程
封装 requestContext 对象, full_dispatch_request(视图函数 执行), response返回
从app.run() 开始 -->>
Flask的call方法-->>
wsgi_app (封装RequestContext(request,session )对象到 localstack) -->>
full_dispatch_request(视图函数 执行) -->>
执行扩展(before_request) ,触发信号 -->>
获取response -->>
pop reqeust,session -- >>
结束
(1)threading local 和 flask的自定义local对象
- 基于本地线程 可以实现,为了支持协程,自己定义了一个local对象
(2) 请求到来
封装 ctx = RequestContext(request,session)
ctx -- 放入 Local __storage__ { 'id':{stack:[ctx]} }
(3)执行视图
导入 request
print(reqeust) -- >> localproxy __str__
reqeust.method -- >> localproxy __getattr__
reqeust + 1 -- >> localproxy __add__
调用 _lookup_req_object 函数 去local中的ctx 中 获取 reqeust session
(4) 请求结束
ctx.auto_pop
ctx 从 local 中移除




class RequestContext(object):
def push(self):
_request_ctx_stack.push(self) # 将请求的相关数据 加到 local中,stack,local
self.session = self.app.open_session(self.request)
if self.session is None:
self.session = self.app.make_null_session()
# 将请求的相关数据 加到 local中,stack,local
# 获取cookie中的随机字符串,检验是否存在,没有就生成一个
# 根据随机字符串,获取服务端保存的 session的值
class Flask(_PackageBoundObject):
def __call__(self, environ, start_response):
return self.wsgi_app(environ, start_response)
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ) # 创建request对象
ctx.push() # 处理 request 和 session
error = None
try:
try:
response = self.full_dispatch_request() #视图函数 执行
return response(environ, start_response)
finally:
ctx.auto_pop(error)
def full_dispatch_request(self):
"""
self.try_trigger_before_first_request_functions()
try:
request_started.send(self) # 触发信号,需要下载 blinker
rv = self.preprocess_request()
if rv is None:
rv = self.dispatch_request()
return self.finalize_request(rv) # 获取response 封装
def finalize_request(self, rv, from_error_handler=False):
response = self.make_response(rv)
try:
response = self.process_response(response)
return response
def process_response(self, response):
ctx = _request_ctx_stack.top
bp = ctx.request.blueprint
funcs = ctx._after_request_functions
if not self.session_interface.is_null_session(ctx.session):
self.save_session(ctx.session, response)
return response











Flask 的整体流程的更多相关文章
- 使用git整体流程
一.git提交代码走meger请求的整体流程 工作中使用git推代码时,如果走merge请求,那么也就是说拉代码时拉公共代码库的代码,但是提交时需要先提交到自己的代码库,然后在gitlab上提交mer ...
- Mybatis技术原理理——整体流程理解
前言:2018年,是最杂乱的一年!所以你看我的博客,是不是很空! 网上有很多关于Mybatis原理介绍的博文,这里介绍两篇我个人很推荐的博文 Mybatis3.4.x技术内幕和 MyBaits源码分析 ...
- iOS开发从申请开发账号到APP上架的整体流程详解
应公司要求,写一份文档从申请账号一直到APP上架的整体流程,下面进入正文. https://blog.csdn.net/qq_35612929/article/details/78754470 首先第 ...
- enzyme design 整体流程及感想
想起什么来写什么吧. 整体流程(以Ceas2, TPP, G3P为例): 准备蛋白即配体参数文件: 设置CST文件: 准备protocol和flag文件: 运行enzyme_design: 结果处理. ...
- 【驱动】input子系统整体流程全面分析(触摸屏驱动为例)【转】
转自:http://www.cnblogs.com/lcw/p/3294356.html input输入子系统整体流程 input子系统在内核中的实现,包括输入子系统(Input Core),事件处理 ...
- vue框架整体流程
1.整体流程 (1)模板解析成render函数 (2)响应式监听 (3)首次渲染,显示页面,绑定依赖 (4)data属性变化,触发rerender 2.模板解析为render函数 参考上一篇博客. 模 ...
- linux input输入子系统分析《四》:input子系统整体流程全面分析
1 input输入子系统整体流程 本节分析input子系统在内核中的实现,包括输入子系统(Input Core),事件处理层(Event Handler)和设备驱动层.由于上节代码讲解了设备 ...
- 微信APP支付整体流程记录备忘
支付整体流程见文档:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3 商户系统和微信支付系统主要交互说明: 步骤1: ...
- (转)linux内存源码分析 - 内存回收(整体流程)
http://www.cnblogs.com/tolimit/p/5435068.html------------linux内存源码分析 - 内存回收(整体流程) 概述 当linux系统内存压力就大时 ...
随机推荐
- PAT 1126 Eulerian Path[欧拉路][比较]
1126 Eulerian Path (25 分) In graph theory, an Eulerian path is a path in a graph which visits every ...
- mysql的两种常用的引擎
MyISAM引擎特点1.不支持事务(事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功,要么全失败)2.表级锁定(数据更新时锁整个表):其锁定机制是表级锁定,这虽然可以让锁定的实现成本很小但 ...
- Delphi 正则表达式语法(2): 或者与重复
Delphi 正则表达式语法(2): 或者与重复 // | 号的使用, | 是或者的意思 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create ...
- maven项目打WAR包记录
打了个war包,各种不顺,也是以前没打过的原因,眼高手低了…… cmd 进入项目目录 打开 运行----cmd 进入命令窗口 键入 cd 回车 输入E\:mars\cdc 键入 mvn clean p ...
- springmvc 需要用到的核心jar包
aopbeanscontextcoreexpressionwebwebmvc
- CSS小知识---table表格
所用的仍是bootstrap的模板 <link rel="stylesheet" href="css/bootstrap.min.css"> < ...
- AFNetworking 3.0 解决加密后请求参数是字符串问题
把整个请求参数的json加密生成一个字符串传给服务器,错误提示:[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top ...
- JavaScript delete用法,属性,特性,执行上下文,激活对象 综合篇
一.问题的提出 我们先来看看下面几段代码,要注意的是,以下代码不要在浏览器的开发者工具(如FireBug.Chrome Developer tool)中运行,原因后面会说明: 为什么我们可以删除对象的 ...
- 关于git bash的问题,pull不下来(登录之后,git帮你记住了,想切换其他用户)
参考博客: https://www.jianshu.com/p/8a7f257e07b8 从某个项目地址pull代码下来,老是报错 fatal: Authentication failed for ' ...
- 通过自动回复机器人学Mybatis:原始版本(包括JDBC、pom.xml等)
imooc视频学习笔记 ----> URL:http://www.imooc.com/learn/154 list.jsp <%@ page contentType="text/ ...