(搬运以学习)flask 上下文的实现
引言
本文主要梳理了flask的current_app, request, session, g的实现原理
源码说明
本文使用flask 0.5 版本
application context 和request context
flask有两个context: application context和request context

这里需要通俗地解释一下application context与request context:
application 指的就是当你调用
app = Flask(__name__)创建的这个对象app;request 指的是每次
http请求发生时,WSGI server(比如gunicorn)调用Flask.__call__()之后,在Flask对象内部创建的Request对象;application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;
application的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request
下面通过源码了解一下 flask 如何实现这两种context:
# 代码摘选自flask 0.5 中的ctx.py文件, 进行了部分删减
class _RequestContext(object): def __init__(self, app, environ):
self.app = app
self.request = app.request_class(environ)
self.session = app.open_session(self.request)
self.g = _RequestGlobals()
flask 使用_RequestContext的代码如下:
class Flask(object):
def request_context(self, environ):
return _RequestContext(self, environ)
在Flask类中,每次请求都会调用这个request_context函数。这个函数则会创建一个_RequestContext对象。
值得注意的是:这个对象在创建时,将Flask实例的本身作为实参传入_RequestContext自身,因此,self.app = Flask()。
所以,虽然每次http请求都会创建一个_RequestContext对象,但是,每次创建的时候都会将同一个Flask对象传入该对象的app成员变量,使得:
由同一个Flask对象响应的请求所创建的_RequestContext对象的app成员变量都共享同一个application
通过在Flask对象中创建_RequestContext对象,并将Flask自身作为参数传入_RequestContext对象的方式,实现了多个request context对应一个application context 的目的。
接下来,看self.request = app.request_class(environ)这句。
由于app成员变量就是app = Flask(__name__)这个对象,所以,app.request_class就是Flask.request_class。
在Flask类的定义中:
request_class = Request # Request 是一个类,定义如下: class Request(RequestBase):
...
所以:self.request = app.request_class(environ)实际上是创建了一个Request对象。
由于,一个http请求对应一个_RequestContext对象的创建,而每个_RequestContext对象的创建对应一个Request对象的创建,所以,每个http请求对应一个Request对象。
到这里想必已经很清楚了:
application 就是指app = Flask(__name__)对象
request 就是对应每次http 请求创建的Request对象
flask通过_RequestContext将app与Request关联起来
总结
app = Flask(__name__)创建了application, 这个application对应的上下文,就是application contextFlask每响应一个http请求,就会创建一个Request对象,这个request对象对应的上下文,就是request context
(搬运以学习)flask 上下文的实现的更多相关文章
- 用尽洪荒之力学习Flask源码
WSGIapp.run()werkzeug@app.route('/')ContextLocalLocalStackLocalProxyContext CreateStack pushStack po ...
- flask上下文详解
一.前言 了解过flask的python开发者想必都知道flask中核心机制莫过于上下文管理,当然学习flask如果不了解其中的处理流程,可能在很多问题上不能得到解决,当然我在写本篇文章之前也看到了很 ...
- Flask上下文管理、session原理和全局g对象
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
- 学习Flask框架
# -*- encoding: utf-8 -*- #导包 from flask import Flask #建立flask对象 app = Flask(__name__) #使用flask路由器 ...
- 初步了解学习flask轻量级框架,
关于flask我有话说 flask作为一个轻量级框架,它里面有好多扩展包需要下载,比较麻烦,而且有的时候flask需要在虚拟环境下运行,但是他的优点还是有滴 ,只要是用过Django的人,都会觉得fl ...
- flask上下文全局变量,程序上下文、请求上下文、上下文钩子
Flask上下文 Flask中有两种上下文,程序上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含 ...
- Flask上下文管理
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
- Flask 上下文(Context)原理解析
:first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { border: 0; m ...
- 学习flask的网址
学习flask的网址: http://www.bjhee.com
随机推荐
- SQL Server迭代求和
drop table t_geovindu create table t_geovindu ( xid int IDENTITY (1, 1), price money, DebitCredit VA ...
- scss-@at-root
@at-root指令可以使一个或多个规则被限定输出在文档的根层级上,而不是被嵌套在其父选择器下. 下面就通过scss代码实例介绍一下它的作用: 没有使用@at-root命令的默认情况. .parent ...
- HTML行内元素、块状元素和行内块状元素的区分
HTML 5 的常用元素分类 HTML可以将元素分类方式分为行内元素.块状元素和行内块状元素三种,这三者是可以互相转换的,通过display属性可以实现互相转换 (1)display:inline;转 ...
- twaver拓扑图拖拽后保存json数据
功能描述:拓扑图.对节点进行拖拽,序列化获取拓扑图信息,保存到本地localStorage,刷新页面,执行反序列化,从本地获取之前保存的数据,展现之前拖拽后的拓扑 拓展:此处存储用的是web本地存储l ...
- php 递归的生成目录函数
/** * 递归的生成目录 * @param str $dir 必须是目录 */ function mkdirs($dir) { return is_dir($dir) ?: mkdirs(dirna ...
- 用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯
最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 ...
- JsonConvert序列化问题
返回的Json数据如下: [[1400025600,9633460,9667535,2698.09,2734.73,2749,2698.08,25333.3057,11784.9,13548.4,69 ...
- Flume的load-balance、failover
配置flume集群参考https://www.cnblogs.com/jifengblog/p/9277793.html load-balance负载均衡 介绍 负载均衡是用于解决一台机器(一个进程) ...
- SourceTree Win10 安装不成功解决过程记录
简介 SourceTree 是一款拥有可视化界面的项目版本控制软件,适用于git项目管理,同时它集成了 git flow 工作流程,对于不熟悉 git 命令的初学者来说,可以通过 SourceTree ...
- Database 2 Day DBA guide_Chapter3
Chapter 3: Getting Started with Oracle Enterprise Manager 第三章:开始oracle企业管理器. Purpose(目的) This chapte ...