故国神游,多情应笑我,早生华发。——苏轼《念奴娇·赤壁怀古》 楠少博客 阅读文章 Python 一大坑,配置文件中字典问题。 楠少 2022-05-13 6666666 8888888 Python 技巧 爬坑 摘要最近在开发系统时发现一个传奇的BUG, 用户未登录就可进入系统内,而且含有真实身份信息。 此问题困扰多时,反复debug。由于找不到问题原因,复现具有不确定性,只能一边测试一边碰运气一边找。 ## 大坑 +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()`方式。 上一篇:office tool plus 工具 下一篇:通知:系统账号服务正在升级,短期内无法登录。 文章评论 [ 聊聊技术 聊聊自己 ] 在巴甫洛夫条件反射 试验中:给定一条狗,每次摇铃后喂食,足够次数后,狗则听到铃声将会习惯性的分泌唾液,由此引发对铃声的依恋。延伸到实际,给定一个喜欢的妹子,每次见面赠与巴甫洛夫式 的礼品或者零食,由此引发妹子的依恋。引入薛定谔的猫 理论,在未表白前,妹子与自己一直处于一种“概率云”的状态,一旦表白则“概率云”将消失成为实际。在 巴甫洛夫式 后且未表白前,自己与妹子的关系为“既是恋人又不是恋人”的矛盾体。返回巴甫洛夫式 试验中,在妹纸形成足够的依恋过后,则可以打破薛定谔 “概率云”的状态。这个谜一样的自己,这一刻 薛定谔 附体,带着量子论般深沉的哀愁,让她从此不能自拔! 自此创作 巴甫洛夫薛定谔把妹法,深藏功与名。