Flask Python:请求上下文和应用上下文

请求上下文和应用上下文详解

    • 一、背景
    • 二、什么是上下文
      • 2.1、请求上下文
      • 2.2、应用上下文
      • 2.3、两种上下文的底层逻辑
    • 三、写在最后

一、背景

在如何实现异步发送邮件的时候,遇到过这样一个报错

RuntimeError: Working outside of request context.This typically means that you attempted to use functionality that
needed an active HTTP request. Consult the documentation on testing
for information about how to avoid this problem.

当时虽然是在请求里使用的curent_app方法,已经有了请求上下文和应用上下文,但是任然报错,终究原因是没有记住文档上说的current_app的含义,它只是个代理,每个线程都是隔开的,一个线程一个id;它是根据id去找的,就好比说一开始current_app的id是1,然后新开了一个线程,新线程的id是2,那我在2里使用1,肯定就找不到喽,如何解决文档上也有说,使用current_app._get_current_object()就可以了,
在这里插入图片描述
代码里就是这样,而不是直接传递current_app
在这里插入图片描述

二、什么是上下文

上下文是 context 直译的叫法,在程序中用来表示代码执行过程中所处的前后环境,比如在文件操作时,文件需要打开关闭,而文件读写操作就处于文件操作的上下文环境中。

Flask中有两种上下文:请求上下文(文档点这里查看)和应用上下文(文档点这里查看),

  • 1、请求上下文(Request Context):当处理请求时,请求相关的信息会被存储在请求上下文中,例如请求参数、请求头、请求方法、当前的URL以及与请求相关的其他信息。请求上下文可以通过request对象访问。

  • 2、应用上下文(Application Context):应用上下文包含了关于应用的配置和状态的信息,例如配置对象、数据库连接、注册的蓝图等。在应用上下文中,可以使用current_app和g对象访问这些信息。

请求上下文和应用上下文是由Flask的调用栈自动创建和销毁的,不需要手动处理

2.1、请求上下文

在 flask 中,可以直接在视图函数中使用 request 这个对象进行获取相关数据,而 request 就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有:request、session

  • request:封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get(‘user’),获取的是get请求的参数。
  • session:用来记录请求会话中的信息,针对的是用户信息。举例:session[‘name’] = user.id,可以记录用户信息。还可以通过session.get(‘name’)获取用户信息。

2.2、应用上下文

它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。
类型是LocalProxy,像全局变量一样工作,但只能在处理请求期间且在处理它的线程中访问,返回的栈顶元素不是应用上下文,而是flask的应用实例对象。

应用上下文的封装 = flask核心对象+和外部协作对象(在flask封装对象上再添加push、pop等)(请求上下文同理)
应用上下文是存放到一个 LocalStack 的栈中。和应用app相关的操作就必须要用到应用上下文。

2.3、两种上下文的底层逻辑

两者的底层逻辑可以参考这里大佬详解1和大佬详解2,以为已经有了请求上下文,为什么还要有应用上下文,这大佬的文章里也有解释:
在这里插入图片描述

三、写在最后

这是我比较懒的一次,因为太偏底层,我也讲述不出来,只能前人栽树后人乘凉了哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/578341.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

奥比中光Astra SDK相机SDK openni相机成像原理

目录 1.1 成像原理简介 1.1.1 结构光 1.1.2 双目视觉 1.1.3 光飞行时间TOF​ 2.使用手册 参考网址 2.1 产品集成设计 2.2 SDK介绍与使用 2.3 常用API介绍 OPENNI API 2 OpenNI类(OpenNI.h) 1.1 成像原理简介 1.1.1 结构光 结构光&#xff0…

PyTorch深度学习

一、深度学习的概念 如上所示,人工智能包含了机器学习和深度学习,其中深度学习是机器学习的一种特殊的学习方法,人工智能的核心是深度学习 1、深度学习 深度学习需要用到大量的神经网络构建和运算模块,故出现了很多的深度学习框…

Netty核心原理剖析与RPC实践6-10

Netty核心原理剖析与RPC实践6-10 06-粘包拆包问题:如何获取一个完整的网络包 本节课开始我们将学习 Netty 通信过程中的编解码技术。编解码技术这是实现网络通信的基础,让我们可以定义任何满足业务需求的应用层协议。在网络编程中,我们经常…

三个表的联合查询的场景分析-场景4:c表维护a和b表的id关联关系(一对多)

基础SQL演练,带详细分析,笔记和备忘。 目录 背景介绍 表数据 需求1:查询g表所有记录,以及关联的h的id 需求2:在需求1基础上,查出关联的h的其它字段(name) 需求3:在需…

1、Cocos Creator 基础入门

目录 Cocos Creator 是什么? 语言支持 功能特性 工作流程 功能模块 相关游戏 参考 Cocos Creator 是什么? Cocos Creator 既是一款高效、轻量、免费开源的跨平台 2D&3D 图形引擎,也是一个实时 2D&3D 数字内容创作平台。拥有…

vue3封装Element导航菜单

1. 导航外层布局 AsideView.vue <template><el-menu:default-active"defaultActive"class"my-menu":collapse"isCollapse":collapse-transition"false"open"handleOpen"close"handleClose"><menu…

aeon,一个好用的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - aeon Github地址&#xff1a;https://github.com/aeon-toolkit/aeon 在现代计算机科学和人工智能领域&#xff0c;处理时间序列数据是一个重要而复杂的任务。Python aeon库…

AI计算平台设计方案:901-基于3U VPX的图像数据AI计算平台

一、产品概述 设备基于3U VPX的导冷结构&#xff0c;集成FPGA接口预处理卡&#xff0c;GPU板卡、飞腾ARM处理卡&#xff0c;实现光纤、差分电口或者Camera link的图像接入&#xff0c;FPGA信号预处理&#xff0c;GPU AI计算&#xff0c;飞腾ARM的采集管理存储。 二、系统…

2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)

C题-翻转⭐ 标签:贪心 简述:如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 链接: 翻转 思路:要求步骤最少->S每个位置最多修改一次->从头开始遍历不匹配就翻转->翻转不了就-1 …

HarmonyOS 应用开发之线程模型

Stage模型下的线程主要有如下三类&#xff1a; 主线程 执行UI绘制。管理主线程的ArkTS引擎实例&#xff0c;使多个UIAbility组件能够运行在其之上。管理其他线程的ArkTS引擎实例&#xff0c;例如使用TaskPool&#xff08;任务池&#xff09;创建任务或取消任务、启动和终止Wor…

harbor api v2.0

harbor api v2.0 v2.0 v2.0 “harbor api v2.0”与原来区别较大&#xff0c;此处harbor也做了https。另外&#xff0c;通过接口拿到的数据也是只能默认1页10个&#xff0c;所以脚本根据实际情况一页页的抓取数据 脚本主要用于统计repo、image&#xff0c;以及所有镜像的tag数&…

学习鸿蒙基础(9)

目录 一、鸿蒙国际化配置 二、鸿蒙常用组件介绍 三、鸿蒙像素单位介绍 四、鸿蒙布局介绍 1、Row与Column线性布局 2、层叠布局-Stack 3、弹性布局 4、栅格布局 5、网格布局 一、鸿蒙国际化配置 base目录下为默认的string。en_US对应美国的。zh_CN对应中国的。新增一个s…