You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:07:13