(二十二)Flask之上下文管理第三篇【收尾—讲一讲g】

news2024/11/17 0:17:37

目录:

  • 每篇前言:
  • g到底是什么?生命周期
      • 在请求周期内保持数据
      • 需要注意的是:
  • 拓展—面向对象的私有字段
      • 深入讲解一下那句:

每篇前言:

  • 🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者

  • 🔥🔥本文已收录于Flask框架从入门到实战专栏:《Flask框架从入门到实战》
  • 🔥🔥热门专栏推荐:《Python全栈系列教程》、《爬虫从入门到精通系列教程》、《爬虫进阶+实战系列教程》、《Scrapy框架从入门到实战》、《Flask框架从入门到实战》、《Django框架从入门到实战》、《Tornado框架从入门到实战》、《前端系列教程》。
  • 📝​📝本专栏面向广大程序猿,为的是大家都做到Python全栈技术从入门到精通,穿插有很多实战优化点。
  • 🎉🎉订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
  • 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

在这里插入图片描述

g到底是什么?生命周期

在 Flask 中,g 是一个特殊的对象,它提供了一个用于存储和共享数据的全局命名空间。Flask 使用上下文全局变量来使某些对象在一个请求周期内全局可访问,而不会与其他请求的上下文冲突。g 是其中之一,专门用来存储和共享请求周期内的数据。

g 对象在每次请求开始时被重置(所以它是不能当session对象来用的!因为它不能跨请求保持状态!!!),在不同请求间是独立的,这意味着我们可以在处理请求时将数据附加到 g而不用担心来自其他请求的冲突或数据遗留。

在请求周期内保持数据

g 对象非常适合用来缓存数据,比如数据库连接,这样就不必在每次请求时都重新建立连接。

如下在请求开始时连接数据库,并在请求结束时关闭连接:

from flask import g, current_app


@app.before_request
def before_request():
    # 假设有一个函数 get_db 来获取数据库连接
    g.db = get_db()


@app.teardown_request
def teardown_request(exception=None):
    # 如果数据库连接已经存在,则关闭它
    db = getattr(g, 'db', None)
    if db is not None:
        db.close()

在上面的例子中,使用 before_request 钩子来在处理每个请求之前设置数据库连接,并将其存储在 g 对象中。然后,在请求处理完成后,使用 teardown_request 钩子来清理数据库连接。

需要注意的是:

  • g 对象是线程隔离的,每个请求在处理时会在其自己的线程中运行,所以不同请求中的 g 对象不会相互干扰。
  • g 对象只在请求生命周期内有效。一旦请求结束,存储在 g 对象中的数据就不再可用。
  • 不应该使用 g 对象来存储大量数据或者对于多个请求来说应该保持不变的数据。如果需要这种类型的存储,考虑使用应用上下文、数据库或缓存系统。

拓展—面向对象的私有字段

源码LocalProxy进去:

在这里插入图片描述

前面我讲过上图红框那一句等价于:

self.__local = 函数

现在来细细讲一下为啥?

首先,类里面以双下划线开头的为私有属性,在类的外部访问不了会报错:

在这里插入图片描述

但其实Python是支持我们在外部调用的:

在这里插入图片描述

通过【下划线加类名加双下划线加私有属性】就可以了!

深入讲解一下那句:

在 Python 中,object.__setattr__(self, name, value) 是一种特殊的方法,用于设置属性的值。默认情况下,我们一般使用 self.name = value 的语法来设置属性,但如果需要在定义了自己的 __setattr__ 方法的类中设置属性,而不触发那个类的 __setattr__ 方法,就可以使用 object.__setattr__() 这种直接调用基类 object 来实现。

所以,object.__setattr__(self, "_LocalProxy__local", local) 这行代码做的就是设置 LocalProxy 实例的 __local 属性,而不会触发 LocalProxy 类已经定义的自己的 __setattr__

这段代码使用 Python 的 名称改写(name mangling) 来确保 __local 属性是私有的。在 Python 中,以双下划线开头的属性名称会被解释器改写,以包含类名来避免子类中的名称冲突。例如,_LocalProxy__local 实际上是 LocalProxy 类的一个私有属性。这种改写意味着它不能被类的外部直接访问,只能在类的内部访问【但是其实可以访问,但是没人会这么做,也不会有人让你这么做!】。

这样,任何对 LocalProxy 实例的 __local 属性的引用或者赋值都会通过 LocalProxy 类定义的方法进行,而不是直接操作属性,这对于保持封装和管理属性访问是很有帮助的。然而,在初始化的时候,类需要能够设置这个值,而不是通过可能已经定义的 __setattr__ 方法,这就是为什么这里会直接调用 object__setattr__ 方法。

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

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

相关文章

Java项目:21 基于SSM实现的图书借阅管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 基于SSM实现的图书借阅管理系统设计了两个角色,分别是管理员、用户,在数据表user中以ident字段区分,为1表示管理员…

Vue中如何使用dayjs

Day.js中文网Day.js是一个极简的JavaScript库,可以为现代浏览器解析、验证、操作和显示日期和时间。https://dayjs.fenxianglu.cn/ 单位不区别大小写,支持复数和缩写形式 单位缩写描述 date D日期 [1,31]dayd星期 [0,6](星期日0&#xff0c…

【开源】JAVA+Vue.js实现超市账单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

尾矿库排洪系统结构仿真软件WKStruc(可试用)

1、背景介绍 尾矿库作为重大危险源之一,在国际灾害事故排名中位列第18位,根据中国钼业2019年8月刊《中国尾矿库溃坝与泄漏事故统计及成因分析》的统计,在46起尾矿库泄漏事故中,由于排洪设施导致的尾矿泄漏事故占比高达1/3&#x…

【SpringCloud】使用 Spring Cloud Alibaba 之 Sentinel 实现微服务的限流、降级、熔断

目录 一、Sentinel 介绍1.1 什么是 Sentinel1.2 Sentinel 特性1.3 限流、降级与熔断的区别 二、实战演示2.1 下载启动 Sentinel 控制台2.2 后端微服务接入 Sentinel 控制台2.2.1 引入 Sentinel 依赖2.2.2 添加 Sentinel 连接配置 2.3 使用 Sentinel 进行流控(含限流…

【LeetCode: 105. 从前序与中序遍历序列构造二叉树 + DFS】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【精选】Java面向对象进阶——内部类

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

设计师常常从哪些网站获取灵感?

1、Pinterest Pinterest是一个基于图片共享的社交网站。用户可以在平台上浏览、收集和分享各种想法、设计灵感和项目。Pinterest用户可以在其网站或应用程序上创建虚拟画板(boards),根据主题或兴趣收集和整理你最喜欢的图片(包括…

RxJS 核心原理-操作符(源码实现)

本文将深入探讨RXJS操作符的核心原理,并介绍一些常见的操作符、应用场景以及相应的代码示例。通过理解RXJS的响应式编程思想,您将能够更好地应用它来处理异步数据流和事件流。 建议读者在阅读本文之前,先参考我的另一篇文章《深入浅出 RxJS …

IDM(Internet Download Manager)2024免激活绿色版下载

IDM(Internet Download Manager)在安全保护方面提供了多种功能和策略,以确保用户的下载体验和数据安全。以下是一些IDM的安全保护功能和策略: IDM绿色下载如下: https://wm.makeding.com/iclk/?zoneid34275 病毒扫描功能&#…

Spring之AOP源码解析(中)

前言 在上一篇文章中,我们讲解了Spring中那些注解可能会产生AOP动态代理,我们通过源码发现,完成AOP相关操作都和ProxyFactory这个类有密切关系,这一篇我们将围绕这个类继续解析 演示 作用 ProxyFactory采用策略模式生成动态代理对象,具体生成cglib动态代理还是jdk动态代理,…

FairyGUI × Cocos Creator 3.x 使用方式

前言 上一篇文章 FariyGUI Cocos Creator 入门 简单介绍了FairyGUI,并且按照官方demo成功在Cocos Creator2.4.0上运行起来了。 当我今天使用Creator 3.x 再引入2.x的Lib时,发现出现了报错。 这篇文章将介绍如何在Creator 3.x上使用fgui。 引入 首先&…

想把握现货黄金价格走势 这两点能助你掌握优势

现货黄金价格走势很是狡猾,想要抓准它的波动是很难的。但我们作为投资者,偏要与它较劲。想要像捕捉猎物一样捕捉到现黄金价格走势,以下这两点投资者要注意。 了解清楚自己的风格适合什么市场?投资者有比较固定的投资风格&#xff…

Day4. 文件IO的基本概念和读写

温习&#xff1a; 文件的拷贝&#xff08;单个字符&#xff09;(fgetc/fputc) #include <stdio.h>int main(void) {FILE* fp NULL;FILE* fq NULL;char ch 0;fp fopen("str.txt","r");if (fp NULL){perror("file to fopen!");retur…

指南 | 从概念到实践:探索独立站在当代电商中的关键作用

搭建电商独立站指南 随着数字化时代的到来&#xff0c;电子商务已成为全球商业生态的核心组成部分。在这个不断变化的市场中&#xff0c;独立站作为企业建立在线身份和拓展业务的强大工具&#xff0c;正逐步展现出其不可替代的价值。 从概念到实践&#xff0c;本文将深入探索独…

1500W SMB TVS

TVS的简介 瞬态电压抑制二极管&#xff0c;简称TVS。当TVS两极受到反向瞬态高能量冲击时&#xff0c;它能以 10- s的速度&#xff0c;将其两极间的高阻抗变为低阻抗&#xff0c;吸收高达数千瓦的浪涌功率&#xff0c;使两极间的电压钳位于一个预定值&#xff0c;有效地保护电子…

Linux环境安装Git(详细图文)

说明 此文档Linux环境为&#xff1a;Ubuntu 22.04&#xff0c;本文档介绍两种安装方式&#xff0c;一种是服务器能联网的情况通过yum或apt命令下载&#xff0c;第二种采用源码方式安装。 一、yum/apt方式安装 1.yum方式安装Git 如果你的服务器环境是centos/redhot&#xff…

理论学习-ARM-内核

ARM内核 函数的调用加载、存储计算中断异常线程的切换注意事项参考文献 为了提高学习效率&#xff0c;我们要提前想好学习策略。 首先&#xff0c;使用频率越高的知识点&#xff0c;越要首先学习。假使&#xff0c;我们学习了一个知识点&#xff0c;能覆盖工作中80%的工作量&am…

Java Swing游戏开发学习1

不使用游戏引擎&#xff0c;只使用Java SDK开发游戏的学习。 游戏原理 图片来自某大佬视频讲解 原理结合实际代码 public class GamePanel extends Jpanel implements Runnable {...run(){}// 详情看下图... }项目结构 运行效果 代码code 在我的下载里面可以找到&#xf…

【MATLAB】EEMD_ MFE_SVM_LSTM 神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 EEMD_MFE_SVM_LSTM神经网络时序预测算法是一种结合了多种技术的复杂预测方法&#xff0c;旨在提高时序预测的准确性和稳定性。以下是对该算法的详细介绍&#xff1a; EEMD&#xff08;扩展…