Flask 上下文是什么 ?

这篇具有很好参考价值的文章主要介绍了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.toymoban.com/news/detail-419495.html

 

到了这里,关于Flask 上下文是什么 ?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ⛳ 多线程面试-什么是多线程上下文切换?

    多线程会共同使用一组计算机上的CPU ,而线程数大于给线程分配的 CPU 数量时,为了让各个线程都有执行的机会,就需要轮转使用CPU。 不同的线程切换使用 CPU, 发生的切换数据等, 就是上下文切换 在上下文切换过程中, CPU 会停止处理当前运行的程序, 并保存当前程序运行的具

    2024年02月14日
    浏览(43)
  • 什么是层叠上下文(stacking context)?它是如何形成的?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月12日
    浏览(40)
  • 超长上下文处理:基于Transformer上下文处理常见方法梳理

    原文链接:芝士AI吃鱼 目前已经采用多种方法来增加Transformer的上下文长度,主要侧重于缓解注意力计算的二次复杂度。 例如,Transformer-XL通过缓存先前的上下文,并允许随着层数的增加线性扩展上下文。Longformer采用了一种注意力机制,使得token稀疏地关注远距离的token,从而

    2024年02月13日
    浏览(52)
  • 无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

    目前,ChatGPT、Llama 2、文心一言等主流大语言模型,因技术架构的问题上下文输入一直受到限制,即便是Claude 最多只支持10万token输入,这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题,加州伯克利分校受操作系统的内存管理机制启发,提出了MemGPT。

    2024年02月06日
    浏览(64)
  • 从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

            当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是 中断执行完毕后要恢复到原来执行的程序 ,除了时间流逝外,原来运行的程序应该毫无感知。        

    2024年02月11日
    浏览(67)
  • 〖大前端 - 基础入门三大核心之JS篇(51)〗- 面向对象之认识上下文与上下文规则

    说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费 , 如需要项目实战或者是体系化资源,文末名片加V! 作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司担任研发部门CTO。 荣誉: 2022年度博客之星Top4、2023年度超级个体得主、谷

    2024年02月05日
    浏览(61)
  • js执行上下文

    创造执行上下文,是为了把变量声明给保存下来,在执行时,好找到变量用 看代码要分执行前(构建执行上下文)和执行时去看 执行上下文的组成 1、词法环境:[全局对象]、scope、outer 2、This Binding:提供this的访问 构建执行上下文 1、处理声明 2、检查重复定义 3、初步赋值

    2024年02月02日
    浏览(69)
  • 执行上下文

    通过var定义(声明)的变量--在定义语句之前就可以访问到 值为undefined 通过function声明的函数--在之前就可以直接调用 值为函数定义(对象) 全局代码 函数(局部)代码 在执行全局代码前将window确定为全局执行上下文 对全局数据进行预处理 var定义的全局变量--undefined--添加

    2023年04月20日
    浏览(58)
  • Servlet 上下文参数

    2024年02月05日
    浏览(58)
  • 上下文切换性能篇

    现代操作系统都是多任务的分时操作系统,也就是说同时响应多个用户交互或同时支持多个任务处理,因为 CPU 的速度很快而用户交互的频率相比会低得多。所以例如在 Linux 中,可以支持远大于 CPU 数量的任务同时执行,对于单个 CPU 来说,其实任务并不是在同时执行,而是操

    2024年02月15日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包