当前位置: 首页 > 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集群多节点角色配置深入详解【转】
  • 10个确保微服务与容器安全的最佳实践
  • 5、React组件事件详解
  • canvas 五子棋游戏
  • Laravel5.4 Queues队列学习
  • Less 日常用法
  • oschina
  • Redis的resp协议
  • Redis中的lru算法实现
  • vue2.0项目引入element-ui
  • 阿里云应用高可用服务公测发布
  • 仿天猫超市收藏抛物线动画工具库
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 收藏好这篇,别再只说“数据劫持”了
  • 我的面试准备过程--容器(更新中)
  • 应用生命周期终极 DevOps 工具包
  • 用Visual Studio开发以太坊智能合约
  • 阿里云ACE认证之理解CDN技术
  • ​Linux·i2c驱动架构​
  • #Z0458. 树的中心2
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (一) storm的集群安装与配置
  • (一)认识微服务
  • (转)socket Aio demo
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .net CHARTING图表控件下载地址
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core 中的路径问题
  • .Net Web窗口页属性
  • .net6Api后台+uniapp导出Excel
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET序列化 serializable,反序列化
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [android] 请求码和结果码的作用
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [bzoj1901]: Zju2112 Dynamic Rankings