一、什么是上下文

每一段程序都有很多外部变量,只有像add这种简单的函数才是没有外部变量的,一旦你的一段程序有了外部变量,这段程序就不完整了,不能独立运行,你为了使他们能运行,就要给所有的外部变量一个一个写一些值进去,这些值的集合就叫上下文

比如:在flask中,视图函数需要知道它执行情况的请求信息(请求的url,参数,方法等),以及应用信息,(应用中初始化的数据库等),才能够正确运行。

最直观地做法是把这些信息封装成一个对象,作为参数传递给视图函数。但是这样的话,所有的视图函数都需要添加对应的参数,即使该函数内部并没有使用到它。

flask 的做法是把这些信息作为类似全局变量的东西,视图函数需要的时候,可以使用 from flask import request 获取。但是这些对象和全局变量不同的是——它们必须是动态的,因为在多线程或者多协程的情况下,每个线程或者协程获取的都是自己独特的对象,不会互相干扰。

那么如何实现这种效果呢?如果对 python 多线程比较熟悉的话,应该知道多线程中有个非常类似的概念 threading.local,可以实现多线程访问某个变量的时候只看到自己的数据。内部的原理说起来也很简单,这个对象有一个字典,保存了线程 id 对应的数据,读取该对象的时候,它动态地查询当前线程 id 对应的数据。flask 上下文的实现也类似。

二、flask的执行流程

从app.__call__进入

执行wsgi_app,environ是请求的信息,start_response是返回的信息

进入wsgi_app,flask最主要是以下执行内容

进入request__content方法

执行init函数

进入request_class

点进ctx.push()

点进_request_ctx_stack查看

点击进入LocalStack()查看

在看push()

三、视图函数中查看request对象

先看LocalProxy,类实例化产生对产,参数是一个偏函数,偏函数执行后就是request对象

燃料在print打印request时,会执行__str__,或者__reper__

最新文章

  1. http协议进阶(三)补充:报文首部
  2. ZeroMQ接口函数之 :zmq_errno – 返回errno的值给调用此函数的线程
  3. CIO:让IT成为企业的一种竞争优势
  4. javascript平时小例子①(移动的小div)
  5. iOS 企业证书发布app 流程
  6. C++虚函数、赋值兼容原则
  7. Cordova+angularjs+ionic+vs2015开发(一)
  8. 用PL0语言求Fibonacci数列前m个中偶数位的数
  9. iOS 日历类(NSCalendar)
  10. JavaScript删除数组重复元素的5个高效算法
  11. C primer plus 读书笔记第十二章
  12. 数据结构的javascript实现
  13. Django session存储到redis数据库
  14. 某公司面试java试题之【一】,看看吧,说不定就是你将要做的题
  15. loj#3 -Copycat
  16. POJ1177(扫描线求周长并)
  17. windows10 下安装tensorflow 并且在jupyter notebook 上使用tensorflow
  18. 外网电脑配置8G运行内存,运行Android Studio,速度很轻松
  19. EZOJ #227
  20. android drag

热门文章

  1. Debian怎么配置网卡(IP)
  2. 2019 牛客多校第三场 H Magic Line
  3. 54Mbps、150Mbps、433Mbps 你知道这三个Wi-Fi速率怎么算的吗?
  4. 19-MySQL-Ubuntu-数据表的查询-自关联(八)
  5. Reading books /// Prim+BFS oj21633
  6. IDEA与Tomcat的相关配置说明
  7. javascript 的学习笔记(第一天)
  8. 记一次数据丢失(电脑硬盘closed to down)的经历
  9. Eclipse注释快捷键、如何生成API以及可能遇到的问题解决
  10. Java 基础 - final vs static