flask请求上下文源码分析
一、什么是上下文
每一段程序都有很多外部变量,只有像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__
最新文章
- http协议进阶(三)补充:报文首部
- ZeroMQ接口函数之 :zmq_errno – 返回errno的值给调用此函数的线程
- CIO:让IT成为企业的一种竞争优势
- javascript平时小例子①(移动的小div)
- iOS 企业证书发布app 流程
- C++虚函数、赋值兼容原则
- Cordova+angularjs+ionic+vs2015开发(一)
- 用PL0语言求Fibonacci数列前m个中偶数位的数
- iOS 日历类(NSCalendar)
- JavaScript删除数组重复元素的5个高效算法
- C primer plus 读书笔记第十二章
- 数据结构的javascript实现
- Django session存储到redis数据库
- 某公司面试java试题之【一】,看看吧,说不定就是你将要做的题
- loj#3 -Copycat
- POJ1177(扫描线求周长并)
- windows10 下安装tensorflow 并且在jupyter notebook 上使用tensorflow
- 外网电脑配置8G运行内存,运行Android Studio,速度很轻松
- EZOJ #227
- android drag
热门文章
- Debian怎么配置网卡(IP)
- 2019 牛客多校第三场 H Magic Line
- 54Mbps、150Mbps、433Mbps 你知道这三个Wi-Fi速率怎么算的吗?
- 19-MySQL-Ubuntu-数据表的查询-自关联(八)
- Reading books /// Prim+BFS oj21633
- IDEA与Tomcat的相关配置说明
- javascript 的学习笔记(第一天)
- 记一次数据丢失(电脑硬盘closed to down)的经历
- Eclipse注释快捷键、如何生成API以及可能遇到的问题解决
- Java 基础 - final vs static