Django中session变量reset_code无法更新,始终保留首次生成值
问题根源
你在verify_code视图的验证码不匹配分支里,用requests.Session()发起了一个新的HTTP请求到/reset,这个请求属于服务器端的独立会话,和当前用户浏览器持有的session完全无关。新生成的验证码被存在了这个临时会话里,用户浏览器的session根本没更新,所以后续验证还是拿旧的验证码对比,自然一直失败。
修复方案
直接复用已有的codeSender函数来生成并发送新验证码,不需要通过HTTP请求调用自己的视图。这样就能直接操作当前用户的session,更新reset_code的值。
修改后的verify_code视图代码:
def verify_code(request): user_pk = request.session.get('user') user = User.objects.filter(pk=user_pk).first() if request.method == "POST": codetrial = request.POST.get("code") if int(codetrial) == request.session.get('reset_code'): return redirect("resetConfirm") else: clear_messages(request) # 直接调用codeSender生成新验证码,更新当前用户session codeSender(request, user) messages.error(request, '验证码不匹配!已重新发送,请重试') # 复用原有的消息序列化逻辑,返回一致的JSON响应 serialized_messages = json.dumps([{ 'message': message.message, 'message_tag': message.tags, } for message in messages.get_messages(request)]) response_data = { 'show_form2': True, 'messages': serialized_messages } return JsonResponse(response_data) else: return render(request, "authentication/resetPasswordConfirm.html", {"user": user.username})
补充说明
- 去掉冗余的
requests调用后,代码更简洁,且直接操作当前用户的request.session,新生成的验证码会立即同步到用户浏览器的会话中,无需刷新页面。 - 保持了原有响应逻辑的一致性,前端可以继续用相同的方式处理返回的JSON数据。
内容的提问来源于stack exchange,提问作者ZahRaF
相关产品推荐
相关产品推荐

