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

Django项目登录失败3次触发密码重置提示的显示异常排查

问题根因

当前实现中登录失败后Django会重定向回登录页,页面整体刷新,JS中定义的全局计数变量会被重新初始化,因此无法累计失败次数。


方案1:前端JS实现(简单快速)

核心采用localStorage存储失败次数,页面刷新不会丢失,修改后的JS代码如下:

<script type="text/javascript">
// 页面加载时初始化登录失败次数,无存储记录时默认值为3
window.onload = function() {
    if(!localStorage.getItem('login_attempts')) {
        localStorage.setItem('login_attempts', 3);
    }
}

function checkAttempts() {
    // 先去除文本前后空格,避免格式问题导致匹配失败
    var failed_alert = document.querySelectorAll("a")[0].textContent.trim();
    var login_attempts = parseInt(localStorage.getItem('login_attempts'));

    if (failed_alert === "Invalid username or password") {
        login_attempts--;
        localStorage.setItem('login_attempts', login_attempts);
        console.log(login_attempts);
        alert('登录失败');

        if (login_attempts <= 0) {
            alert("你是否需要重置密码?");
            // 可在此处添加跳转重置密码页的逻辑:window.location.href = '/reset-password/'
            // 可根据需求选择重置计数或者禁用表单提交
            // localStorage.removeItem('login_attempts');
        }
    } else {
        // 登录成功后清除存储的失败次数,避免影响后续正常登录
        localStorage.removeItem('login_attempts');
        console.log(login_attempts);
        return false;
    }
}
</script>

方案2:Django后端实现(更安全,无法被用户绕过)

通过Django自带的session存储用户登录失败次数,数据存在服务端,可靠性更高,无需修改前端逻辑,修改views.py代码如下:

def login(request):
    if request.user.is_authenticated:
        return redirect('/')
    else:
        # 初始化session中的失败次数,默认0次
        if 'login_failed_count' not in request.session:
            request.session['login_failed_count'] = 0

        if request.method == 'POST':
            username = request.POST['username']
            password = request.POST['password']

            user = auth.authenticate(username=username, password=password)

            if user is not None:
                # 登录成功,清空失败次数
                request.session['login_failed_count'] = 0
                auth.login(request, user)
                return HttpResponseRedirect(request.GET.get('next', LOGIN_REDIRECT_URL))
            else:
                # 登录失败,次数+1
                request.session['login_failed_count'] += 1
                # 超过3次的话,在提示中加入重置密码引导
                if request.session['login_failed_count'] >=3:
                    messages.info(request, 'Invalid username or password, you have tried too many times, do you want to reset your password?')
                else:
                    messages.info(request, 'Invalid username or password')
                return redirect('login.html')
        else:
            return render(request, 'login.html')

该方案后续调整失败次数阈值、锁定时长等逻辑都只需修改后端参数,更易维护。


内容的提问来源于stack exchange,提问作者martae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:06:07