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

目录:

  • 每篇前言:
  • 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.mzph.cn/news/695657.shtml

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

相关文章

Django使用Celery异步

安装包 pip install celerypip install eventlet 1.在项目文件的根目录下创建目录结果 2. 在main.py文件中 # !/usr/bin/env python # -*-coding:utf-8 -*-""" # Author :skyTree # version :python 3.11 # Description&#…

备战蓝桥杯---动态规划(应用2(一些十分巧妙的优化dp的手段))

好久不见,甚是想念,最近一直在看过河这道题(感觉最近脑子有点宕机QAQ),现在算是有点懂了,打算记录下这道又爱又恨的题。(如有错误欢迎大佬帮忙指出) 话不多说,直接看题&…

2024年【T电梯修理】最新解析及T电梯修理操作证考试

题库来源:安全生产模拟考试一点通公众号小程序 T电梯修理最新解析根据新T电梯修理考试大纲要求,安全生产模拟考试一点通将T电梯修理模拟考试试题进行汇编,组成一套T电梯修理全真模拟考试试题,学员可通过T电梯修理操作证考试全真模…

maven配置多仓库私服

经常见我们除了需要官方的仓库以外,更多是配置了国内的阿里云公共仓库。但很多的企业会有自己的公共组件,两者会结合起来使用,就需要配置公司的私服。 而经常性的,我们会在 apache-maven-3.8.6\conf\settings.xml 中,…

Django学习笔记-HTML实现服务器图片的下载

1.index编写代码,跳转下载页面 2.创建download界面 3.编写download路由 4.创建download函数 1).如果请求的方法是GET,imglist变量存储从models.imgModel模型中获取的所有对象,创建字典ctx,使用render函数来渲染download.htm 2).如果请求的方法是POST,获取要下载的文…

啤酒:精酿啤酒与沙拉的轻盈享受

在繁忙的生活中,我们总是在寻找一种简单而健康的美食享受。当Fendi Club啤酒与沙拉相遇,它们将为我们带来一场轻盈的味觉之旅。 Fendi Club啤酒,以其醇厚的口感和淡淡的麦芽香气而闻名。这款啤酒在酿造过程中采用了特别的工艺,使得…

【Python】2019年蓝桥杯省赛真题——完全二叉树的权值

蓝桥杯 2019 省 A&B:完全二叉树的权值 题目描述 给定一棵包含 N N N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是 A 1 , A 2 , ⋯ A N A_1,A_2, \cdots A_N A1​,A2​,⋯AN​,如下图所…

Python接口自动化框架设计到开发,赶紧用起来!

1.如何设计一个接口自动化测试框架 根据接口地址、接口类型、请求数据、预期结果来进行设计,对于需要登录后才能进行操作的接口那么则需要进行header cookie等数据的传递,自动化测试的难点就是数据依赖。 2.python操作excel获得内容 首先python操作exce…

Java 学习和实践笔记(16):类的理解以及初始值

类,英文名叫class。基本上对应的就是语言里的名词。 比如,房子、人、树、花、汽车等等,这些名词,这些可以定义成类。 以房子为例,作为一个房子,它一定有相应的属性,比如房顶、墙、门、窗等等&…

windows下采用 nginx配置websocket支持wss流程

第一步、安装OpenSSL (1)下载OpenSSL软件包 地址:https://slproweb.com/products/Win32OpenSSL.html OpenSSL版本说明: Win64 OpenSSL v1.1.1wLight,安装Win64 OpenSSL v1.1.1w最常用的软件包 Win64 OpenSSL v1.1…

动态头部:统一目标检测头部与注意力

论文地址:https://arxiv.org/pdf/2106.08322.pdf ai阅读论文_论文速读_论文阅读软件-网易有道速读 创新点是什么? 这篇文档的创新点是提出了一种统一的方法,将对象检测头和注意力机制结合起来。作者在文中提出了一种称为Dynamic Head的方法,通过引入…

JS前端高频面试

JS数据类型有哪些,区别是什么 js数据类型分为原始数据类型和引用数据类型。 原始数据类型包括:number,string,boolean,null,undefined,和es6新增的两种类型:bigint 和 symbol。&am…

STM32—启用按键

​ 目录 1 、电路构成及原理图 2、编写实现代码 main.c main.h key.c 3、代码讲解 4、 烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板,此笔记基于这款开发板记录。 1 、电路构成及原理图 重要!一定先用短路…

LabVIEW轨道交通列车牵引制动试验平台

LabVIEW轨道交通列车牵引制动试验平台 概述 面对城市轨道交通领域对于高效、准确牵引制动系统的迫切需求,开发了一套基于LabVIEW软件与硬件相结合的试验平台。该平台模拟列车的牵引、制动等工况,通过高精度的数据采集与实时图形化展示,提升…

工具:clang-format使用

Visual Studio 在扩展-》管理扩展-》联机-》搜索Format on Save (for VS2022)插件,并安装 安装需要关闭VS,安装后重新打开vs。 这样每次保存源文件时就会自动调用vs默认的clang-format.exe对源码进行缩进,空格等进行格式化 如果想使用自定…

CSS列表学习2

之前学习了列表&#xff1b;继续熟悉&#xff1b; <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title></title><meta charset"utf-8" /><…

leetcode hot100单词拆分

在本题中&#xff0c;我们是要把一个字符串&#xff0c;判断是否能用给的字符串数组中的单词进行拆分&#xff0c;如果可以则返回true&#xff0c;不能的话则返回false。这个题一开始看无法与背包问题联系在一起。但仔细考虑&#xff0c;就是用物品&#xff08;给的字符串数组中…

数据分析(二)自动生成分析报告

1. 报告生成思路概述 怎么快速一份简单的数据分析报告&#xff0c;注意这个报告的特点&#xff1a; --网页版&#xff0c;可以支持在线观看或者分享HTML文件 --标题&#xff0c;动图&#xff0c;原始数据应有尽有 --支持交互&#xff0c;比如plotly交互画面&#xff0c;数据…

索引聚簇因子clustering_factor太大导致不走索引

查询条件超过一个月就不走索引&#xff1a; 检查表的block数和数据行数&#xff1a; select blocks,num_rows from dba_tables where table_name‘MS_MZXX’;blocks:618687 num_rows:20335462 查看聚簇因子clustering_factor的数&#xff1a;select clustering_factor from d…

力扣OJ题——随机链表的复制

题目&#xff1a; 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 要求&#xff1a;构造这个链表的 深拷贝 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中…