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中,在创建一个对象并给它赋予一个变量时,这个赋予的变量仅仅是一个引用它所代表的对象.也就是说新创建的对象只是指向计算机中储存那个对象的内存. 比如 ...
随机推荐
- 帝国cms sql检则标题重复
<?php //检则标题重复 $sql=$empire->query("select id,filename from phome_ecms_news where classid ...
- 基于FMCW的毫米波雷达简介
- 深度学习实现案例(Tensorflow、PaddlePaddle)
深度学习实验案例 文章目录 深度学习实验案例 一.基础理论 实验一:自定义感知机 实验二:验证图像卷积运算效果 二.Tensorflow 实验一:查看Tensorflow版本 实验二:Hellowor ...
- LeetCode刷题之652寻找重复的子树
继续每日分享一道算法题,监督自己学习,不落下算法,有需要一起打卡的uu,可以一起加油呀! 好了,现在开始看题了哈: 给定一棵二叉树 root,返回所有重复的子树. 对于同一类的重复子树,你只需要返回其 ...
- 推荐Visual Studio四款好用插件
我要推荐的4个插件,合理使用可以提高工作效率,分别是: 1.Markdown Editor 可以在vs预览markdown文件的插件 2.Add New File 我们原本在vs中新建文件,需要添加新 ...
- 2步打通ModelArts和Astro,实现AI应用快速落地
摘要:本文以 ModelArts 的"找云宝"自动学习 AI 应用为例,结合低代码平台 Astro 轻应用快速实现一个"找云宝"小应用. 本文分享自华为云社区& ...
- #Python merge函数,pandas库数据查询功能,对标V-LOOKUP
日常办公中,我们经常会遇到需要匹配表,匹配对应数据的场景,在EXCEL中,我们习惯使用VLOOKUP函数或者是X-LOOKUP函数,今天学习的是Python,pandas库中的匹配功能. 首先导入所需 ...
- pgadmin数据输出不存在了?
菜单栏→文件→重置布局.这样数据输出就显示了.
- 2022-08-18:每一个序列都是[a,b]的形式,a < b 序列连接的方式为,前一个序列的b,要等于后一个序列的a 比如 : [3, 7]、[7, 13]、[13, 26]这三个序列就可以依次连
2022-08-18:每一个序列都是[a,b]的形式,a < b 序列连接的方式为,前一个序列的b,要等于后一个序列的a 比如 : [3, 7].[7, 13].[13, 26]这三个序列就可以 ...
- 2022-03-11:int n, int[][] roads, int x, int y, n表示城市数量,城市编号0~n-1, roads[i][j] == distance,表示城市i到城市j距
2022-03-11:int n, int[][] roads, int x, int y, n表示城市数量,城市编号0~n-1, roads[i][j] == distance,表示城市i到城市j距 ...