Flask 上下文是什么 ?

flask,上下文,什么 · 浏览次数 : 255

小编点评

**Flask 上下文** **什么是 Flask 上下文?** Flask 上下文是一种轻量级的线程,用于实现并发执行多个任务。在 Flask 中,通过使用 Local 类实现的上下文,可以创建和管理多个上下文对象来实现并发处理。 **如何创建和使用上下文?** 1. 接收请求时,创建一个 Flask 上下文对象。 2. 为每个请求分配一个上下文对象。 3. 在请求处理完成时,将上下文对象从当前线程中删除并销毁。 **上下文的作用** 上下文包含了全局和请求级别的变量,可以共享在请求处理的各个环节中。这有助于提高并发性和效率。 **创建和使用上下文的两种方式** * **自动激活:**在处理请求时自动创建和激活上下文对象。 * **手动激活:**在需要的时候手动创建和激活上下文对象。 **示例** ```python # 创建一个 Flask 上下文对象 app_context = flask.Local() # 为请求创建上下文对象 @app_context.app_context def my_function(request): # 处理请求 return '响应' ``` **结论** Flask 上下文是一种强大的技术,可以用于实现并发执行多个任务。通过创建和管理上下文,可以提高应用程序的性能和效率。

正文

哈喽大家好,我是咸鱼。今天我们来聊聊什么是 Flask 上下文

 

咸鱼在刚接触到这个概念的时候脑子里蹦出的第一个词是 CPU 上下文

 

今天咸鱼希望通过这篇文章,让大家能够对 Flask 上下文设计的初衷以及应用有一个基本的了解

 

Flask 上下文

我们在使用 Flask 开发 web 程序的时候,通常会面临下面的情况

 

 

假设同一时间内有三台客户端(或浏览器)向 web 服务器发送了请求,那么 Flask 应用是如何分辨出这三个请求属于哪台客户端(或浏览器)并返回正确的响应的呢?

 

聪明的你结合文章题目很快就想到了——Flask 上下文

 

在 Flask 中,通过本地线程技术来实现上下文隔离。本地线程是一种轻量级的线程,它可以在同一个进程中创建多个线程,并且每个线程拥有独立的堆栈和寄存器等资源,因此可以并发地执行多个任务

 

1、接收到请求的时候,Flask 会为每个请求创建一个 Flask 上下文对象,这个上下文对象包含了一些全局或者请求级别的变量

 

2、处理请求的时候,Flask 会为这个请求的上下文对象分配或创建一个本地线程,这样就可以在处理请求的各个环节当中通过本地线程来访问这个请求的上下文对象了

 

3、请求处理完毕之后,Flask 会将请求上下文对象从当前线程中删除并销毁。这样就能保证每次请求都是独立的,避免了线程安全问题

 

结合上面的例子我们得知,首先 Flask 应用会为这三个请求分配(或创建)到不同的线程中,然后创建与三个请求对应的三个 Flask 上下文对象(应用上下文和请求上下文)并存储到本地线程当中

 

到这里有小伙伴可能会问,Flask 应用是如何区分这三个请求上下文的呢?

 

Flask 使用的上下文是通过 werkzeug.local 模块中的 Local 类实现的。Local 对象实际上是一个字典,它的键是线程 ID,值是该线程对应的上下文对象

 

所以说,Flask 通过线程 ID 来区分不同的请求上下文

 

两种上下文

现在我们知道了,Flask 会自动为每个请求创建一个专属的独一无二的环境,称为上下文

 

这个上下文环境包含了一些全局级别和请求级别的变量,可以在请求处理的整个过程当中使用

 

也就是说,Flask 上下文由两部分组成——应用上下文和请求上下文

 

应用上下文(application context)

当一个 Flask 应用启动时,会自动创建一个应用上下文对象。这个应用上下文对象表示整个应用的运行环境,用于存储应用全局的变量和配置(应用配置、数据库连接信息等)

 

对于每个请求来说,应用上下文对象会在当前请求处理之前创建,并且会一直存在到请求处理完毕之后才被销毁。这意味着,应用上下文对象可以在整个请求生命周期内共享数据

 

请求上下文(request context)

当请求到达 Flask 应用的时候,每一个请求都会有一个专属的请求上下文环境,用于存储请求相关的变量和信息(请求路径、请求方法、请求参数等等)

 

应用上下文和请求上下文的区别

可以看到,应用上下文是全局的,表示整个 Flask 应用的运行环境,而请求上下文是针对每个请求独立的,表示该请求的运行环境

 

在应用程序的整个生命周期中,应用上下文只有一个,而且存在于应用的整个生命周期中。而请求上下文会随着请求的到来而动态创建和销毁

 

对于每个请求来讲,应用上下文是每个请求共享的,请求上下文是每个请求独有的

 

举个简单的例子,比如说有一家大型超市(Flask 应用),每当有顾客来超市买东西的时候(相当于请求到达 Flask 应用),店员就会为每个顾客分配一个购物车(本地线程)

 

这个购物车里面存放了每个顾客的商品、折扣券(请求上下文)等等。购物车里面的东西是每个顾客专属的、独有的(不同请求的请求上下文是独立的)

 

当顾客消费完毕之后,购物车里面的东西就会清空,店员就会回收这些购物车,等待分配给下一个顾客使用(请求处理完毕之后将请求上下文对象从当前线程中删除并销毁,并后续为新到的请求分配线程)

 

而这个超市里面的电梯、货架以及商品(应用上下文)都是每个顾客共享的(应用上下文是每个请求共享的)

 

当超市关门的时候,电梯、货架以及商品就不能够对外使用了(应用上下文存在于应用的生命周期中)

 Flask 上下文激活

Flask 上下文可以分为自动激活和手动激活两种方式

 

自动激活

自动激活是指 Flask 在处理请求时自动激活应用上下文和请求上下文,无需手动干预,这样可以避免在代码中频繁手动创建和销毁上下文对象,使得代码更加简洁

 

下面这些情况中,Flask 会自动激活应用上下文:

  • 使用 flask run 命令启动程序时

  • 使用旧命令 app.run()启动程序时

  • 执行使用 @app.cli.command() 装饰器注册 flask 命令时

  • 使用 flask shell 命令启动 python shell 时

 

当请求进入时,Flask 会自动激活请求上下文

 

手动激活

在一些特殊情况下需要手动创建或激活上下文对象

 

例如在使用 Flask 提供的测试客户端进行单元测试时,需要手动创建应用上下文和请求上下文,并在测试完成后手动销毁,以保证测试环境的隔离性

 

  • 手动激活应用上下文

在 Flask 中,手动激活应用上下文可以通过使用 app.app_context()  上下文管理器来实现

 

 

  • 手动激活请求上下文

 

总的来说,无论使用哪种方式,激活 Flask 上下文的目的都是为了能够在处理请求的过程中访问请求上下文,并且在请求处理完毕后,正确地销毁请求上下文

 


感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力

 

与Flask 上下文是什么 ?相似的内容:

Flask 上下文是什么 ?

哈喽大家好,我是咸鱼。今天我们来聊聊什么是 Flask 上下文 咸鱼在刚接触到这个概念的时候脑子里蹦出的第一个词是 CPU 上下文 今天咸鱼希望通过这篇文章,让大家能够对 Flask 上下文设计的初衷以及应用有一个基本的了解 Flask 上下文 我们在使用 Flask 开发 web 程序的时候,通常

Flask框架:运用Ajax轮询动态绘图

Ajax是异步JavaScript和XML可用于前后端交互,在之前`《Flask 框架:运用Ajax实现数据交互》`简单实现了前后端交互,本章将通过`Ajax`轮询获取后端的数据,前台使用`echart`绘图库进行图形的生成与展示,后台通过`render_template`方法返回一串JSON数据集,前台收到后将其应用到绘图库上,实现动态监控内存利用率的这个功能。

快速上手python的简单web框架flask

简介 python可以做很多事情,虽然它的强项在于进行向量运算和机器学习、深度学习等方面。但是在某些时候,我们仍然需要使用python对外提供web服务。 比如我们现在有一个用python写好的模型算法,这个模型算法需要接收前端的输入,然后进行模拟运算,最终得到最后的输出。这个流程是一个典型的web

Canvas画布

之前Web上的动画都是使用Flash实现的。比如动画,广告,游戏等等,基本上都是Flash实现的。 Flash是有缺点的,需要安装Adobe Flash Player, 漏洞多,重量大,卡顿不流程等。 Html5提出了一个新的canvas标签,彻底颠覆了Flash的主导地位。现在无论广告,动画,游戏

痞子衡嵌入式:浅聊恩智浦i.MXRT官方SDK里关于串行Flash相关的驱动与例程资源(上篇)

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MXRT官方SDK里关于串行Flash相关的驱动与例程资源。 经常有同事以及 i.MXRT 客户咨询痞子衡,咱们恩智浦官方 SDK 里有哪些串行 Flash 相关的示例,每一次痞子衡都是按照询问需求将 SDK 里相应资源路径发

文件系统(九):一文看懂yaffs2文件系统原理

liwen01 2024.07.07 前言 yaffs 是专为nand flash 设计的一款文件系统,与jffs 类似,都是属于日志结构文件系统。与jffs 不同的是,yaffs 文件系统利用了nand flash 一些特有属性,所以在数据读写擦除和回收上都有较大的差异。 关于jffs2文件系统的

Flask API 如何接入 i18n 实现国际化多语言

​ 1. 介绍 上一篇文章分享了 Vue3 如何如何接入 i18n 实现国际化多语言,这里继续和大家分享 Flask 后端如何接入 i18n 实现国际化多语言。 用户请求 API 的多语言化其实有两种解决方案: 后端返回:"USER_ERROR" => 前端渲染:"用户错误" 后端接收请求中 "Ac

Arduino实现温湿度传感器以及数据上传到云(乐维互联)

0 准备材料 0.1 ESP-01S 引脚及定义 官方定义: 序号 pin 功能 1 GND 地线 2 IO0/GPIO0 工作模式选择:①悬空:Flash Boot,工作模式 ②下拉:UART DownLoad 下载模式 3 IO2/GPIO2 通用IO 4 RX/RXD 数据接收端 5 TX/T

[flask]统一API响应格式

前言 在设计API返回内容时,通常需要与前端约定好API返回响应体内容的格式。这样方便前端进行数据反序列化时相应的解析处理,也方便其它服务调用。不同公司有不同的响应内容规范要求,这里以常见的JSON响应体为例: { "code": 200, "data": { "content": "this is

在 Flask 项目中配置 Session:简明指南

本文介绍如何在 Flask 项目中配置会话 1. Flask 内置会话 Flask 自带会话管理功能,使用客户端 Cookie 存储会话数据。默认情况下,会话数据是签名的,以防止篡改,但未加密。因此,不建议在会话中存储敏感信息。Flask 内置会话适用于小型应用或会话数据量较少的情况。此外,默认情况