Python 一大坑,配置文件中字典引用问题(拷贝)。
大坑 +1
python 配置文件中字典引用问题
最近在开发系统时发现一个传奇的BUG, 用户未登录就可进入系统内,而且含有真实身份信息。
此问题困扰多时,反复debug。由于找不到问题原因,复现具有不确定性,只能一边测试一边碰运气一边找。
简单介绍一下系统:
- 该系统使用
Python
Fastapi
框架技术开发后端。 - 前端使用
VUE
(非重点)技术。 - 数据库使用的是
Mysql
。 - 中间件
Redis
在登录前,用户无token
的情况下,系统会为其生成一个token
并从配置文件中读取初始化对象(重点)
并直接赋值始化该对象、存入Redis
。
登录后 将修改该用户的token
对象,填充登录信息、身份信息等。
大概情况如上。
复现一下问题:
- 用户登录后,打开无痕页面访问登录页面,系统居然跳转到了用户资料页(登录成功),显然 这不符合逻辑。
- 并且该现象刚开始并不会出现,时间久了(应该是触发某段逻辑之后)就一直会发生。
问题分析:
- 由于不知道什么时候出现该问题,复现具有不确定性,只能每次发现出现问题之后才能定位。
- 于是从入口开始,逐步输出、日志。一步步精确问题出现的位置。
- 无甚至怀疑过是
redis
的问题。 - 几天过后,终于被我逮到了。
在初始化
token
对象时, 是从配置文件读取的初始化对象(字典)INIT_OBJ = {"login": False}
。
在出问题之后,读取的该对象并不是配置文件里刚开始配置的对象。于是想到是否是该对象的引用被修改了。
修改该对象的赋值语句后(由直接复制obj = INIT_OBJ
,修改为拷贝复制obj = INIT_OBJ.copy()
),问题解决。
解决方案:
配置文件中:INIT_OBJ = {"login": False}
在赋值的时候,将直接复制语句:obj = INIT_OBJ
,修改为拷贝后复制 obj = INIT_OBJ.copy()
。
问题解决。
总结。
在系统运行过程中,某处的对象引用直接修改了
config
中的配置对象的引用,由于是字典,不拷贝新对象默认返回该变量的地址值。
在以后遇到过程中,不变的字典变量 赋值均采用a=DICT.copy()
方式。
Python 一大坑,配置文件中字典引用问题(拷贝)。的更多相关文章
- Java SpringBoot 加载 yml 配置文件中字典项
将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中 Spring Boot 中 yml 配置.引用其它 yml 中的配置.# 在配置文件目录(如:resources)下新建app ...
- spring配置文件中xsd引用问题
XML的一些概念 首先来看下xml的一些概念: xml的schema里有namespace,可以给它起个别名.比如常见的spring的namespace: xmlns:mvc="http ...
- 转:spring配置文件中xsd引用问题
来自:http://blog.csdn.net/dingqinghu/article/details/46758671
- python中字典的使用
python中的字典的特性: 在字典中的元素是散列存放的,没有顺序, 在进行增删改查的时候使用字典中需要的关键字(key)即可. 一: 创建字典 1)直接定义一个: dict = {'ob1':'co ...
- python中的引用
作为一个python初学者,今天被一个python列表和词典引用的问题折磨了很久,但其实了解了缘由也很简单,记录在此备忘. 首先背书python中的引用对象问题: 1. python不允许程序员选择采 ...
- Python中的变量、引用、拷贝和作用域
在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...
- Python中字典和集合
Python中字典和集合 映射类型: 表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引 与序列不同,映射是无序的,通过键进行索引 任何不可变对象都可用作字典的键,如字符串.数字.元 ...
- python中的引用传递,可变对象,不可变对象,list注意点
python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...
- 【Python】Python中的引用和赋值
本文转自:http://my.oschina.net/leejun2005/blog/145911 在 python 中赋值语句总是建立对象的引用值,而不是复制对象.因此,python 变量更像是指针 ...
- Python中的引用的使用注意
关于Python中的引用的一些使用注意 在python中,在创建一个对象并给它赋予一个变量时,这个赋予的变量仅仅是一个引用它所代表的对象.也就是说新创建的对象只是指向计算机中储存那个对象的内存. 比如 ...
随机推荐
- Moebius数据库多活集群
背景 数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为"IT的心脏".因此,让数据库安全.稳定.高效地运行已经成为IT管理者必须要面对的问题.数据库在底层架构 ...
- LeeCode 动态规划(三)
完全背包问题 题目描述 有 n 件物品和容量为 w 的背包,给你两个数组 weights 和 values,分别表示第 i 件物品的重量和价值,每件物品可以放入多次,求解将哪些物品装入背包可使得物品价 ...
- Rust中的into函数和from函数
1.Rust中的into函数和from函数是做什么用的? into函数是Rust语言中的一个转换函数,它属于Into trait.它可以将一个类型转换为另一个类型.实现了From trait的类型会自 ...
- day18:json模块&time模块&zipfile模块
json模块 1.关于json的定义 所有的编程语言都能够识别的数据格式叫做json,是字符串能够通过json序列化成字符串与如下类型: (int float bool str list tuple ...
- 联系我们html代码
Syntor by Aceto 11 Boleyn Court, Manor Park, Runcorn, Chesire WA7 1SR +44 (0) 1928 579865 + 44 (0) 1 ...
- 玩转云端 | 算力基础设施升级,看天翼云紫金DPU显身手!
数字时代下,算力成为新的核心生产力,传统以CPU为核心的架构难以满足新场景下快速增长的算力需求,具备软硬加速能力的DPU得以出现并快速发展.天翼云凭借领先的技术和丰富的应用实践自研紫金DPU,打造为云 ...
- 深入理解python虚拟机:程序执行的载体——栈帧
深入理解python虚拟机:程序执行的载体--栈帧 栈帧(Stack Frame)是 Python 虚拟机中程序执行的载体之一,也是 Python 中的一种执行上下文.每当 Python 执行一个函数 ...
- 原来Spring能注入集合和Map的computeIfAbsent是这么好用!
大家好,我是3y,今天继续来聊我的开源项目austin啊,但实际内容更新不多.这文章主是想吹下水,主要聊聊我在更新项目中学到的小技巧. 今天所说的小技巧可能有很多人都会,但肯定也会有跟我一样之前没用过 ...
- 【python爬虫】bilibili综合热门页面视频图片爬取
此博客仅作为交流学习 我用python来爬取bilibili综合热门页面视频图片 首先分析页面: 如上图所示,当我们想要在页面爬取图片时,往往得不到页面图片的地址,这时我们也得不到图片 开始抓包分析: ...
- 2022-09-10:以下go语言代码输出什么?A:编译错误;B:49.0;C:49。 package main import ( “fmt“ ) func main() { ch
2022-09-10:以下go语言代码输出什么?A:编译错误:B:49.0:C:49. package main import ( "fmt" ) func main() { ch ...