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.mzph.cn/news/785245.shtml

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

相关文章

【机器学习】数据探索---python主要的探索函数

在上一篇博客【机器学习】数据探索(Data Exploration)—数据质量和数据特征分析中,我们深入探讨了数据预处理的重要性,并介绍了诸如插值、数据归一化和主成分分析等关键技术。这些方法有助于我们清理数据中的噪声、消除异常值,以及降低数据的…

C语言内存函数(超详解)

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 点击主页:optimistic_chen和专栏:c语言, 创作不易,大佬们点赞鼓…

KIl5:Stm32L071下载出现flash download faild “cortex-m0+“的解决方法

首先看看有没有芯片,没有芯片下载一下 下载并在device选择对应的芯片 选择调试器 选择flash

C++ 二叉树OJ题

💓博主CSDN主页:麻辣韭菜-CSDN博客💓   ⏩专栏分类:C知识分享⏪   🚚代码仓库:C高阶🚚   🌹关注我🫵带你学习更多C知识   🔝🔝 前言 C二叉搜索树 这篇讲解了搜索二叉…

MySQL经验分享:Shell开发问题

背景 之前整理过Python连接使用MySQL的经验,链接如下: pymysql封装总结_pymysql封装类-CSDN博客 相比高级语言,Shell与MySQL开发使用相对会更麻烦一些;由于 shell是linux命令集的概称,是属于命令行的人机界面。Shel…

1688采集商品信息 马帮 店小秘 芒果采集API接口 java php

1688详情API接口是一种基于开放平台的应用程序接口,它能够实现与1688平台的数据交互,让商家能够更加方便地获取商品详情、库存信息、价格变动等重要数据。通过这一接口,商家可以实时掌握市场动态,快速响应消费者需求,从…

jenkins进行自动化部署

jenkins自动化部署 hello,大家好,前文我们已经下载好我们的jenkins了,下面我们用jenkins来实现自动化部署啦! 一、下载插件 我们选择插件管理 一个是Maven Integration plugin,一个是 Publish Over SSH 这里因为作…

【uniapp】uniapp实现免密登录

文章目录 一、概要二、整体架构流程三、技术名词解释四 、技术细节1.存取token有效期?2.使用setStorageSync而不使用setStorage?3.使用onLaunch而不使用全局路由? 一、概要 打开一个网页或小程序的时候,我们有时候会自动进入主页…

嵌入式驱动学习第五周——驱动模块

前言 Linux驱动有两种运行方式,第一种是将驱动编译进Linux内核中,另一种是编译成模块,本篇博客来介绍一下驱动模块。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可…

Oladance、南卡、韶音开放式耳机值得买吗?爆款实测拒绝踩坑!

​在寻找最佳开放式耳机的过程中,我亲自试用并评估了市场上三个备受欢迎的品牌:Oladance、南卡和韶音。通过全面的多维度性能测试,我旨在为大家提供准确的购买指南,避免因选择不当而遭遇音质失真或佩戴不适的问题。 选择正确的耳…

window7 SP2

网上很多window7 SP1的更新教程,很少有sp2的教程 参考博客Windows 7 Service Pack 2 Download and Install (64-bit/32-bit) 即 转到 Microsoft 网站上的 Windows 7 Service Pack 2下载页面 。 选择与 Windows 7 版本相对应的 “下载 ”链接。 也可以 登录官网…

https安全性 带给im 消息加密的启发

大家好,我是蓝胖子,在之前# MYSQL 是如何保证binlog 和redo log同时提交的?这篇文章里,我们可以从mysql的设计中学会如何让两个服务的调用逻辑达到最终一致性,这也是分布式事务实现方式之一。今天来看看我们能够从http…

【Qt 学习笔记】Day3 | 使用两种方式实现helloworld

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Day3 | 使用两种方式实现helloworld 文章编号:Qt 学习笔记…

移动硬盘怎么加密?移动硬盘加密软件有哪些?

移动硬盘是我们在工作中最常用的移动存储设备,为了保护数据安全,需要使用专业的移动硬盘加密软件加密保护。那么,移动硬盘加密软件有哪些? ​BitLocker BitLocker是Windows的磁盘加锁功能,可以用于加密保护移动硬盘中…

MySQL(常用函数、多表查询)

文章目录 1.数据库函数1.count函数案例答案count(*)与count(列)的区别 2.sum函数案例答案 3.avg函数案例答案 4.max/min函数案例答案 5.group by 分组统计案例答案 6.字符串相关函数演示练习 7.数学相关函数演示 8.日期相关函数演…

Linux系统使用Docker部署个人IT工具箱IT-Tools结合内网穿透实现公网访问

作为程序员,在日常工作中,需要借助一些工具来提高我们工作效率,IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能,使开发者能以更高效方式完成任务。经由IT-Tools,开发人员能轻松应对各类技术挑战&…

鸿蒙OS开发实例:【通知消息】

背景 HarmonyOS 论坛中有研发人员求助,反馈通知没有没有声音,因此在真机上验证了一下,果不其然,没有通知的提示音,后来解决办法也非常简单,在手机设置应用中,将可以打开的通知提示统统改为铃声…

告别繁琐代码,只需简单拖拽,便可从0到1开发!

告别繁琐代码,拥抱科技未来!只需简单拖拽,便可从0到1开发!代码即刻生成,一键下载,轻松上手。我们的低代码平台,不仅高效便捷,更完全开源,让你自由探索编程的无限可能&…

设计模式-装饰者模式在Java中使用实例-打印发票装饰抬头和脚注

场景 设计模式-装饰者模式在Java中的使用示例: 设计模式-装饰者模式在Java中的使用示例_java装饰者模式例子-CSDN博客 上面装饰器的调用示例如下 AbstarctComputer computer;//要买1台电脑computer new BaseComputer();//加一个内存条computer new MemoryDecor…

【面试专题】Spring高频面试题

1.Spring应该很熟悉吧?来介绍下你的Spring的理解 有些同学可能会抢答,不熟悉!!! 好了,不开玩笑,面对这个问题我们应该怎么来回答呢?我们给大家梳理这个几个维度来回答 1.1 Spring的发展历程 先介绍Spring是怎么来的…