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. 1threading local flask的自定义local对象
  2. - 基于本地线程 可以实现,为了支持协程,自己定义了一个local对象
  3. (2) 请求到来
  4. 封装 ctx = RequestContext(request,session)
  5. ctx -- 放入 Local __storage__ { 'id':{stack:[ctx]} }
  6. 3)执行视图
  7. 导入 request
  8. print(reqeust) -- >> localproxy __str__
  9. reqeust.method -- >> localproxy __getattr__
  10. reqeust + 1 -- >> localproxy __add__
  11. 调用 _lookup_req_object 函数 local中的ctx 获取 reqeust session
  12. 4 请求结束
  13. ctx.auto_pop
  14. ctx local 中移除

  1. class RequestContext(object):
  2. def push(self):
  3. _request_ctx_stack.push(self) # 将请求的相关数据 加到 local中,stack,local
  4. self.session = self.app.open_session(self.request)
  5. if self.session is None:
  6. self.session = self.app.make_null_session()
  7. # 将请求的相关数据 加到 local中,stack,local
  8. # 获取cookie中的随机字符串,检验是否存在,没有就生成一个
  9. # 根据随机字符串,获取服务端保存的 session的值
  10. class Flask(_PackageBoundObject):
  11. def __call__(self, environ, start_response):
  12. return self.wsgi_app(environ, start_response)
  13. def wsgi_app(self, environ, start_response):
  14. ctx = self.request_context(environ) # 创建request对象
  15. ctx.push() # 处理 request 和 session
  16. error = None
  17. try:
  18. try:
  19. response = self.full_dispatch_request() #视图函数 执行
  20. return response(environ, start_response)
  21. finally:
  22. ctx.auto_pop(error)
  23. def full_dispatch_request(self):
  24. """
  25. self.try_trigger_before_first_request_functions()
  26. try:
  27. request_started.send(self) # 触发信号,需要下载 blinker
  28. rv = self.preprocess_request()
  29. if rv is None:
  30. rv = self.dispatch_request()
  31. return self.finalize_request(rv) # 获取response 封装
  32. def finalize_request(self, rv, from_error_handler=False):
  33. response = self.make_response(rv)
  34. try:
  35. response = self.process_response(response)
  36. return response
  37. def process_response(self, response):
  38. ctx = _request_ctx_stack.top
  39. bp = ctx.request.blueprint
  40. funcs = ctx._after_request_functions
  41. if not self.session_interface.is_null_session(ctx.session):
  42. self.save_session(ctx.session, response)
  43. return response

Flask 的整体流程的更多相关文章

  1. 使用git整体流程

    一.git提交代码走meger请求的整体流程 工作中使用git推代码时,如果走merge请求,那么也就是说拉代码时拉公共代码库的代码,但是提交时需要先提交到自己的代码库,然后在gitlab上提交mer ...

  2. Mybatis技术原理理——整体流程理解

    前言:2018年,是最杂乱的一年!所以你看我的博客,是不是很空! 网上有很多关于Mybatis原理介绍的博文,这里介绍两篇我个人很推荐的博文 Mybatis3.4.x技术内幕和 MyBaits源码分析 ...

  3. iOS开发从申请开发账号到APP上架的整体流程详解

    应公司要求,写一份文档从申请账号一直到APP上架的整体流程,下面进入正文. https://blog.csdn.net/qq_35612929/article/details/78754470 首先第 ...

  4. enzyme design 整体流程及感想

    想起什么来写什么吧. 整体流程(以Ceas2, TPP, G3P为例): 准备蛋白即配体参数文件: 设置CST文件: 准备protocol和flag文件: 运行enzyme_design: 结果处理. ...

  5. 【驱动】input子系统整体流程全面分析(触摸屏驱动为例)【转】

    转自:http://www.cnblogs.com/lcw/p/3294356.html input输入子系统整体流程 input子系统在内核中的实现,包括输入子系统(Input Core),事件处理 ...

  6. vue框架整体流程

    1.整体流程 (1)模板解析成render函数 (2)响应式监听 (3)首次渲染,显示页面,绑定依赖 (4)data属性变化,触发rerender 2.模板解析为render函数 参考上一篇博客. 模 ...

  7. linux input输入子系统分析《四》:input子系统整体流程全面分析

    1      input输入子系统整体流程 本节分析input子系统在内核中的实现,包括输入子系统(Input Core),事件处理层(Event Handler)和设备驱动层.由于上节代码讲解了设备 ...

  8. 微信APP支付整体流程记录备忘

      支付整体流程见文档:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3   商户系统和微信支付系统主要交互说明:     步骤1: ...

  9. (转)linux内存源码分析 - 内存回收(整体流程)

    http://www.cnblogs.com/tolimit/p/5435068.html------------linux内存源码分析 - 内存回收(整体流程) 概述 当linux系统内存压力就大时 ...

随机推荐

  1. Linux命令详情

  2. ES6的十个新特性

    这里只讲 ES6比较突出的特性,因为只能挑出十个,所以其他特性请参考官方文档: /** * Created by zhangsong on 16/5/20. *///    ***********Nu ...

  3. python之路 堡垒机paramiko

    paramiko 1.安装 pip3 install paramiko 二.使用 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建S ...

  4. POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】

    POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...

  5. 保护你的代码,生成.a文件以及.framework文件需要注意的地方

    一个好的设计,一个方便使用的控件封装,一个酷炫的动画... 是不是迫不及待要分享给大家你的每一个突然蹦出来的好的idea,那就下手吧! 可是,你想要的只是让大家使用它,而不是把所有技术点都公开给每个人 ...

  6. Linux Shell编程 exit、break、continue

    exit语句 在系统中exit 命令用于退出当前用户的登录状态.在 Shell 脚本中exit 语句是用来退出当前脚本. exit 的语法如下: exit [返回值] 如果在 exit 之后定义了返回 ...

  7. 纯CSS3滑动开关按钮

    在线演示 本地下载

  8. D3学习之地图

    D3学习之地图 (2017.03.09-03.11) 地图的意义 在可视化领域中,将数据点投影和关联到地理区域上,是一个非常关键的内容(体现了可视化中利用读者自身知识常识从而加速吸收信息的原则). G ...

  9. [BZOJ2815]灾难

    题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物的阿米巴告 ...

  10. spring security采用基于简单加密 token 的方法实现的remember me功能

    记住我功能,相信大家在一些网站已经用过,一些安全要求不高的都可以使用这个功能,方便快捷. spring security针对该功能有两种实现方式,一种是简单的使用加密来保证基于 cookie 的 to ...