Python 一大坑,配置文件中字典引用问题(拷贝)。
大坑 +1
python 配置文件中字典引用问题
最近在开发系统时发现一个传奇的BUG, 用户未登录就可进入系统内,而且含有真实身份信息。
此问题困扰多时,反复debug。由于找不到问题原因,复现具有不确定性,只能一边测试一边碰运气一边找。
简单介绍一下系统:
- 该系统使用
PythonFastapi框架技术开发后端。 - 前端使用
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中,在创建一个对象并给它赋予一个变量时,这个赋予的变量仅仅是一个引用它所代表的对象.也就是说新创建的对象只是指向计算机中储存那个对象的内存. 比如 ...
随机推荐
- [操作系统]记一次未尽的三星 Galaxy A6s(SM-G6200)刷机过程
给女王大人刷机,第一次刷机,很遗憾,遇到了三星的"锁三键"问题,没有搞成.记录一下这个过程所涉猎的一些刷机基本知识,不妨当作一次学习过程. 1 刷机过程 Step1 查看手机基本信 ...
- [Java EE]解决浏览器跨域问题
1 解决浏览器跨域问题的方案 方式1: 浏览器(chrome)中取消跨域限制 step1 浏览器 chrome://flags step2 搜索:same step3 将搜索结果中的3个插件[Same ...
- 活字格性能优化技巧(3):如何巧用CDN提升含页面的访问速度
本文由葡萄城技术团队于博客园原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上两篇中我们分享了如何利用数据库主键和表格设置默认不加载数据来提升应用 ...
- 添加索引后SQL消耗量在执行计划中的变化
不同索引的执行效率也是不一样的,下面比较三条SQL语句在正常查询与建立普通索引与位图索引后的CPU消耗量的变化,目的为了是加强对索引的理解与运用 实验步骤:1.创建有特点的大数据表.为了保证索引产生前 ...
- ROS动态调试PID参数
ROS动态调试PID参数 连接小车 注意:必须在同一区域网 ssh clbrobort@clbrobort 激活树莓派主板 roslaunch clbrobot bringup.launch 打开PI ...
- win10 双开微信 微信双开
方法1:鼠标连续点击实现Windows微信双开在桌面上找到微信图标,鼠标左键连续点击2次为打开一个微信,连续点击8次就打开了4个微信. 注意:不要连续点开太多防止卡顿. 方法2:回车键双击微信图标实现 ...
- vue—一个组件调用另一个组件的methods
这种方法不常用,项目中有个地方共享数据了,起初没用vuex做,后来有个地方不好解决,这两个组件没有什么关系 1.首先同一个vue实例来调用两个方法.所以可以建立一个中转站. 建立 util.js 中转 ...
- java镜子之反射篇
文章目录 注解 内置注解 元注解 反射 类的初始化 类加载器 双亲委派机制 反射方法的使用 调用类的方法.成员变量.构造器等 总结 注解和反射是Java中非常重要的知识,一些优秀开源的框架都是大量运用 ...
- flink之Sink to MySQL和Redis
前言 下面这篇文章是使用Flink的Sink 写出数据到Redis和MySQL Flink之Sink写入Redis和MySQL Flink需要添加Sink的时候,需要自己去添加写Sink,我们可以实现 ...
- [ZJOI2020] 序列 线性规划做法/贪心做法
线性规划做法 同时也作为线性规划对偶的一个小小的学习笔记. 以下 \(\cdot\) 表示点积,\(b,c,x,y\) 是行向量. \(A\) 是矩阵,对于向量 \(u,v\) 若 \(\forall ...