Flask 上下文是什么 ?

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

 

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

 

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

 

Flask 上下文

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

 

Flask 上下文是什么 ?

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

两种上下文

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

 

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

 

也就是说,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 上下文的目的都是为了能够在处理请求的过程中访问请求上下文,并且在请求处理完毕后,正确地销毁请求上下文

 


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

 

原文链接:https://www.cnblogs.com/edisonfish/p/17337618.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask 上下文是什么 ? - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • python 列表套json字典根据相同的key筛选数据

    当Python列表中嵌套着多个JSON字典,我们要从中筛选出与某个key相同的数据时,可以通过以下步骤操作: 使用json库中的loads()函数将JSON字符串转换为Python字典 遍历Python列表,逐个字典查找目标key并匹配 如果匹配成功,则保存该字典到一个新的列表 下面,我们将通过两个示例详细讲述这个过程。 示例一 假设我们有如下一个Pytho…

    python 2023年6月3日
    00
  • python 函数定位参数+关键字参数+inspect模块

    Python 函数定位参数、关键字参数和 inspect 模块是 Python 中非常重要的函数特性和模块。在本篇攻略中,我们将详细讲解这三个部分的内容,包括其定义、用法、特点、优缺点和应用示例等。 Python 函数定位参数 Python定位参数(也称为位置参数)指的是函数调用时需要按照参数的定义顺序传递的参数,这些参数是没有指定名称的,用它们的顺序来确定…

    python 2023年6月5日
    00
  • Python-opencv实现红绿两色识别操作

    下面是Python-opencv实现红绿两色识别操作的完整攻略: 1. 安装OpenCV库 在终端中使用pip命令安装OpenCV库: pip install opencv-python 2. 读取图片 导入OpenCV库后,我们可以使用cv2.imread()函数读取图片。这个函数的参数是图片的路径。 import cv2 # 读取图片 img = cv2…

    python 2023年6月6日
    00
  • Python中用xlwt制作表格实例讲解

    以下是Python中用xlwt制作表格实例讲解的完整实例教程: 目录 xlwt模块简介 创建Excel文件 创建工作表 添加数据到工作表 保存Excel文件 完整实例演示 示例说明 1. xlwt模块简介 xlwt是Python中的第三方库,用于创建和操作.xls格式(Excel 97-2003)文件。 2. 创建Excel文件 首先需要导入xlwt模块,并…

    python 2023年5月13日
    00
  • Python 字符串使用多个分隔符分割成列表的2种方法

    下面是详细讲解“Python 字符串使用多个分隔符分割成列表的2种方法”的完整攻略。 方法一:使用正则表达式分割 Python 提供了非常方便的正则表达式工具,可以用正则表达式来分割字符串。以下是代码示例: import re text = ‘hello|world#python’ pattern = re.compile(r'[|#]’) result =…

    python 2023年6月3日
    00
  • 彻底吃透理解Python基础33个关键字详细教程

    彻底吃透理解Python基础33个关键字详细教程攻略 为什么需要掌握33个关键字 Python是一门开放性的高级编程语言,相比其他语言,Python的语法相对简单,并且有着丰富的库和模块,使得编程变得容易。然而要想真正掌握Python的使用,必须首先熟悉Python的关键字。Python的关键字是指Python编程语言中拥有特定含义并且被保留的单词。通过掌握…

    python 2023年5月13日
    00
  • python实现简单聊天功能

    下面是关于如何使用Python实现简单聊天功能的完整攻略。 1. 确定聊天方式 首先,要确定聊天方式。有多种方式可以实现聊天功能,例如: 基于网络的聊天室,可以使用socket库来实现。 基于命令行的聊天,可以使用标准输入输出和多线程来实现。 基于图形化界面的聊天软件,可以使用PyQt或Tkinter等GUI库来实现。 在这里,我们将使用基于命令行的方式来实…

    python 2023年5月19日
    00
  • Python实现括号匹配方法详解

    Python实现括号匹配方法详解 在编程中,经常会出现需要判断一串括号是否匹配的情况。比如在字符串中,括号要求成对出现,否则就是语法错误。本文将介绍Python实现括号匹配的详细攻略。 方法一:使用栈来判断 使用栈来判断括号的匹配关系是一种常见的方法。可以将左括号入栈,遇到右括号就弹出栈顶元素进行匹配。 下面是Python实现该方法的示例代码: def is…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部