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系统内存压力就大时 ...
随机推荐
- Linux命令详情
- ES6的十个新特性
这里只讲 ES6比较突出的特性,因为只能挑出十个,所以其他特性请参考官方文档: /** * Created by zhangsong on 16/5/20. */// ***********Nu ...
- python之路 堡垒机paramiko
paramiko 1.安装 pip3 install paramiko 二.使用 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建S ...
- POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】
POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...
- 保护你的代码,生成.a文件以及.framework文件需要注意的地方
一个好的设计,一个方便使用的控件封装,一个酷炫的动画... 是不是迫不及待要分享给大家你的每一个突然蹦出来的好的idea,那就下手吧! 可是,你想要的只是让大家使用它,而不是把所有技术点都公开给每个人 ...
- Linux Shell编程 exit、break、continue
exit语句 在系统中exit 命令用于退出当前用户的登录状态.在 Shell 脚本中exit 语句是用来退出当前脚本. exit 的语法如下: exit [返回值] 如果在 exit 之后定义了返回 ...
- 纯CSS3滑动开关按钮
在线演示 本地下载
- D3学习之地图
D3学习之地图 (2017.03.09-03.11) 地图的意义 在可视化领域中,将数据点投影和关联到地理区域上,是一个非常关键的内容(体现了可视化中利用读者自身知识常识从而加速吸收信息的原则). G ...
- [BZOJ2815]灾难
题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物的阿米巴告 ...
- spring security采用基于简单加密 token 的方法实现的remember me功能
记住我功能,相信大家在一些网站已经用过,一些安全要求不高的都可以使用这个功能,方便快捷. spring security针对该功能有两种实现方式,一种是简单的使用加密来保证基于 cookie 的 to ...