当前位置: 首页 > news >正文

(搬运以学习)flask 上下文的实现

引言

本文主要梳理了flask的current_app, request, session, g的实现原理

源码说明

本文使用flask 0.5 版本

application context 和request context

flask有两个context: application contextrequest context

这里需要通俗地解释一下application contextrequest context

  1. application 指的就是当你调用app = Flask(__name__)创建的这个对象app

  2. request 指的是每次http请求发生时,WSGI server(比如gunicorn)调用Flask.__call__()之后,在Flask对象内部创建的Request对象;

  3. application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;

  4. 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通过_RequestContextappRequest关联起来

总结

    1. app = Flask(__name__)创建了application, 这个application对应的上下文,就是application context

    2. Flask每响应一个http请求,就会创建一个Request对象,这个request对象对应的上下文,就是request context

 

转载于:https://www.cnblogs.com/wf-skylark/p/9218879.html

相关文章:

  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • h2db新手入门篇——概念及初步使用
  • Android 布局巧用之include、merge、ViewStub
  • HTML(form标签)、CSS选择器一
  • 初始 Mybatis(一) —— 基本配置及用法
  • OpenStack Newton部署官方指南
  • 小前端眼里的大前端:GMTC 2018 参会小结
  • Rails哲学三原则
  • TCPDF 如何实现首行缩进
  • https请求过程
  • 一个JS多个数组取交集算法
  • JS对象的克隆
  • 作为面试官如何从深度和广度上考察面试者
  • 沃森想通过社交网络筛出最想要优惠券的人
  • 刨根问底 | Elasticsearch 5.X集群多节点角色配置深入详解【转】
  • JavaScript-如何实现克隆(clone)函数
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 30天自制操作系统-2
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CSS盒模型深入
  • Linux下的乱码问题
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • swift基础之_对象 实例方法 对象方法。
  • 包装类对象
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 马上搞懂 GeoJSON
  • 通过npm或yarn自动生成vue组件
  • 微服务框架lagom
  • 微信小程序开发问题汇总
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 正则与JS中的正则
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 组复制官方翻译九、Group Replication Technical Details
  • $.ajax中的eval及dataType
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (12)Linux 常见的三种进程状态
  • (poj1.3.2)1791(构造法模拟)
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (分布式缓存)Redis持久化
  • (论文阅读30/100)Convolutional Pose Machines
  • (转)Sql Server 保留几位小数的两种做法
  • .gitattributes 文件
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net Core 中间件验签
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET Project Open Day(2011.11.13)
  • .NET 表达式计算:Expression Evaluator
  • .NET 反射 Reflect
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /deep/和 >>>以及 ::v-deep 三者的区别