首页 > 其他分享 >Flask 上下文是什么 ?

Flask 上下文是什么 ?

时间:2023-04-20 17:33:22浏览次数:33  
标签:请求 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,什么,线程,应用,激活,上下文
From: https://www.cnblogs.com/edisonfish/p/17337618.html

相关文章

  • python的flask写后台API
    @app.route("/",methods=["GET"])defindex():return"indexpage" @app.route("/hello")defhello():return"hello"@app.route("/hey/<username>/")defhey_yingong(username):return......
  • hncloud:什么是双线服务器?它的作用体现在哪?
    我们都知道,服务器是必须接入运营商网络才能连接互联网的,否则你的服务器就只是一个摆设,毕竟服务器的作用就是为了让别人通过网络来远程访问的。而双线服务器,顾名思义就是接入了两条带宽线路的服务器,但这两条线是哪两条呢?我们都知道,国内最大的两个运营商分别是电信和联......
  • MySQL: 为什么使用 innobackupex 备份恢复搭建主从时,必须人为设置 gtid_purged 变量
    问题描述:使用innobackupex搭建主从的步骤如下:1.主库使用innobackupex备份并apply-log2.将备份文件拷贝至从库,从库清空datadir目录,并使用innobackupex进行copy-back3.从库根据备份目录中的xtrabackup_binlog_info的GTID信息来设置gtid_purged变量。4.从库changem......
  • 4 03 | 事务隔离:为什么你改了我还看不见?
    提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱。转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前......
  • 电脑做笔记用什么软件好
    在电子信息化时代,绝大多数的上班族和相当一部分的大学生都会使用电脑来办公或学习。而想要在电脑上记录各种常用的信息、注意事项、感想感悟等内容,使用一款笔记软件来分类记录是比较方便的,这样不仅可以实现分散信息的整合,而且更加方便我们随时修改编辑、删除、分享等。那么在电......
  • ChatGPT闲谈——火出圈的为什么是 OpenAI?
    ChatGPT走入大众视野之后,AIGC行业迎来了爆发,尤其是上个月,仿佛每一天都可能是「历史性」的一天。现在各大网站已经有非常多的优秀创作者进行总结和分析,都是值得一阅的好文。今天本文也分享了关于ChatGPT的看法,有谈到技术,也有关于ChatGPT的闲谈,看完这篇文章,相信你会对ChatGPT有......
  • 哔哩哔哩大会员是什么,怎么低价开通。
     哔哩哔哩大会员是哔哩哔哩(B站)提供的一项高级会员服务,为用户提供更多的特权和优惠,让用户享受更好的观看体验。作为中国最大的弹幕视频分享网站,哔哩哔哩大会员的推广营销非常重要。本文将从以下几个方面阐述哔哩哔哩大会员的优势和营销策略。一、哔哩哔哩大会员的优势1.更优质的......
  • 什么是QQ豪华绿钻会员,如何低价开通?
    QQ豪华绿钻会员,是腾讯QQ为用户提供的一种高级会员服务,具有许多独特的优势和特权。本文将介绍QQ豪华绿钻会员的特点、优势以及如何获得QQ豪华绿钻会员资格,让您更好地了解和体验这一服务。首先,QQ豪华绿钻会员具有许多独特的特点,包括:1.VIP特权:作为QQ豪华绿钻会员,您可以享受许多VIP......
  • 【Flask模板注入】
    【Flask模板注入】——概览背景Flask是python语言下的轻量级web应用框架,可以用来开发一些简单的网站。它使用Jinjia2渲染引擎(将html文件存放在templates文件夹中,当访问指定路由时,flask会渲染出相应的html页面)。但是html文件中不一定都是html语言,Jinjia2引擎支持html文件中内嵌{......
  • Redis为什么快?
    redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。和Memcached类似。redis支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。它的速度快主要归功于以下几个方面:内存数......