Django会话密钥匹配异常:同内容字符串类型一致但比较不成立
Django会话OTP与POST输入字符串匹配失败问题解决
这种问题我碰到过好多次了——明明控制台打印出来俩字符串看起来一模一样,类型也都是str,但比较就是返回False,十有八九是隐藏的空白字符在搞鬼!比如空格、换行符或者制表符,肉眼根本看不出来,但字符串比较是严格区分每一个字符的。
快速排查与解决步骤:
先看字符串长度:
在打印时加上长度信息,立刻就能确认是否有额外字符:otp = str(request.session["otp"]) print(otp, type(otp), len(otp)) user_otp = str(request.POST.get("otp")) print(user_otp, "user_otp", type(user_otp), len(user_otp))如果两个长度不一样,那百分百是有隐藏空白字符存在。
清理两端空白字符:
不管是前端输入时不小心带的,还是存储OTP时意外添加的,用strip()方法可以直接去掉字符串两端的空白:otp = str(request.session["otp"]).strip() # 给POST参数加默认空字符串,避免None转成"None" user_otp = str(request.POST.get("otp", "")).strip() if user_otp == otp: return HttpResponse("u enter")检查OTP存储环节:
确认你把OTP存入会话的时候,有没有不小心带了多余字符。比如生成OTP后误加了换行,或者从其他来源读取时带了空白:# 错误示例:生成时多了换行符 request.session["otp"] = generate_otp() + "\n" # 正确做法:确保存储干净的字符串 request.session["otp"] = generate_otp().strip()终极排查:打印字符ASCII码:
如果还是找不到问题,直接把每个字符的ASCII码打出来,对比就能发现差异:print("OTP字符ASCII:", [ord(c) for c in otp]) print("用户输入OTP字符ASCII:", [ord(c) for c in user_otp])比如空格的ASCII是32,换行是10,两个列表一对比就能找到不一样的地方。
额外小提示:
获取POST参数时,最好给get()方法加个默认空字符串,避免当参数不存在时返回None,转成字符串后变成"None",导致和真实OTP比较失败。
内容的提问来源于stack exchange,提问作者user4612771
相关产品推荐
相关产品推荐

