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内建属性getattribute拦截器使用详解

    Python内建属性getattribute拦截器使用详解 在Python中,__getattribute__方法是一个能够拦截对象属性访问的强大工具。在本文中,我们将介绍该方法的详细用法和示例。 什么是__getattribute__方法? __getattribute__方法是Python的一个内置方法,它在对象属性被访问时被调用。这个方法允许你拦截对于…

    python 2023年6月6日
    00
  • python 将日期戳(五位数时间)转换为标准时间

    将日期戳转换为标准时间,我们可以使用Python内置的datetime模块。 具体步骤如下: 步骤一:导入模块 import datetime 步骤二:获取五位数时间 假设我们有一个五位数时间,如 163361,表示当前时间是2021年10月7日13点33分01秒。 要将其转换为标准时间,首先需要解析出其中的年、月、日、时、分、秒。 # 获取年、月、日、时、…

    python 2023年6月2日
    00
  • Python中集合创建与使用详解

    下面是关于Python中集合创建与使用的详细攻略,包含两个示例说明。 集合的定义 在Python中,集合是一种无序、不重复的数据类型,它是由对花括号{}包裹的元素组成,每个素之间用逗号,`分隔。集合中的元素可以是任何可变的类型,包括数字、字符串、元组等。 集合的创建 在Python中,我们可以使用set()函数或者直接使用括号{}`来创建一个集合。下面是一些…

    python 2023年5月13日
    00
  • Python中os.path用法分析

    Python中os.path用法分析 在Python的标准库os模块中,通过os.path子模块可以对文件路径或目录进行操作。os.path提供了一些常用的方法用于操作目录,例如获取目录名、获取文件路径、判断路径是否存在等等。下文将对os.path进行详细的讲解。 os.path模块简介 os.path模块是Python的内置模块,提供了一些常用的方法用以处…

    python 2023年6月2日
    00
  • python中的字符串切割 maxsplit

    字符串切割是处理字符串时经常遇到的一个需求,它可以将一个字符串分割成多个子字符串,常见的应用场景包括文件路径拆分、分离文件名与扩展名、处理CSV文件等。在Python中,使用 split 函数即可实现字符串切割的功能。 split 函数 split 函数是 Python 中字符串对象的一个方法,用于在指定的分隔符处将字符串分割成多个子字符串,并返回一个列表。…

    python 2023年6月5日
    00
  • 详解如何用Python模拟登录淘宝

    模拟登录淘宝是一个常见的爬虫应用场景,本文将详细讲解如何使用Python模拟登录淘宝,包括获取登录页面、解析登录页面、构造登录请求、处理登录结果和访问登录后的页面。 获取登录页面 在开始模拟登录淘宝之前,我们需要获取登录页面。我们可以使用requests库发送GET请求,获取登录页面的HTML代码。以下是一个示例,演示如何获取登录页面: import req…

    python 2023年5月15日
    00
  • Python使用正则表达式报错:nothing to repeat at position 0的解决方案

    Python使用正则表达式报错:nothing to repeat at position 0的解决方案 在使用Python的re模块进行正则表达式操作时,有时会遇到“nothing to repeat at position 0”的错误。这个错误通常是由于正则表达式中出现了“*”、“+”、“{m,n}”等重复符号,但是这些符号前面没有任何字符导致的。在本文…

    python 2023年5月14日
    00
  • Python使用进程Process模块管理资源

    一、进程管理 在 Python 中可以通过进程 Process 模块来管理进程资源,实现进程的创建、启动、运行、终止等操作。进程的创建可以通过继承 Process 类并实现 run() 方法来完成,下面是一个简单的例子: from multiprocessing import Process class MyProcess(Process): def __i…

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