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

Django如何实现限制用户最多仅输入3次错误OTP验证码

OTP错误次数限制功能实现方案

核心说明:HTTP请求是无状态的,每次用户提交OTP都是独立请求,无法通过循环在多次请求间保留计数,因此需要在数据库中增加字段统计错误尝试次数。

1. 修改models.py的UserOtp模型

给UserOtp表增加错误尝试次数字段,默认值为0:

class UserOtp(models.Model):
    user = models.ForeignKey(User, on_delete= models.CASCADE)
    time_stamp = models.DateTimeField(auto_now= True)
    otp = models.IntegerField()
    # 新增错误次数字段
    failed_attempts = models.IntegerField(default=0)

修改后执行python manage.py makemigrations和python manage.py migrate同步数据库结构。

2. 修改视图中OTP校验的逻辑

找到原有代码中OTP校验的分支,替换为如下逻辑:

if get_otp:
    get_user= request.POST.get('user')
    user = User.objects.get(username=get_user)
    # 获取当前用户最新的OTP记录
    latest_otp = UserOtp.objects.filter(user=user).last()

    if int(get_otp) == latest_otp.otp:
        user.is_active = True
        user.save()
        messages.success(request,'Login to complete the registration process.')
        return redirect('login')
    
    else:
        # 错误次数+1并保存
        latest_otp.failed_attempts += 1
        latest_otp.save()
        # 判断是否达到3次错误
        if latest_otp.failed_attempts >=3:
            # 删除用户,外键级联会自动删除对应的OTP记录
            user.delete()
            messages.error(request, 'OTP错误次数过多,注册已取消,请重新提交注册信息')
            return redirect('register')
        else:
            remaining = 3 - latest_otp.failed_attempts
            messages.error(request, f'OTP输入错误,您还有{remaining}次尝试机会')
            return render(request, 'register.html', {'otp': True, 'user': user})

可选优化点

  • 可以给OTP增加有效期校验,避免用户用很久以前的OTP提交
  • 可以限制用户重新发送OTP的频率,避免恶意刷邮件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:54:00