Python 一大坑,配置文件中字典引用问题(拷贝)。

6 篇文章 0 订阅
4 篇文章 0 订阅

大坑 +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()方式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值