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

如何验证输入邮箱是否已存在于数据库?Django OTP登录问题求助

邮箱存在性校验实现方案

1 修复基础参数获取错误

当前前端AJAX发送的是POST请求,但你在send_otp视图中使用request.GET获取邮箱参数,会无法拿到正确的邮箱值,首先修正该问题:

# 原代码
email = request.GET.get("email")
# 修改为
email = request.POST.get("email")

2 添加邮箱存在性校验逻辑

假设你使用Django默认的User用户模型,在校验前先查询数据库中是否存在对应该邮箱的已注册用户:

# 首先在views.py顶部导入用户模型
from django.contrib.auth.models import User
from django.http import JsonResponse

# 改造后的send_otp视图
def send_otp(request):
    email = request.POST.get("email")
    # 校验邮箱是否存在
    if not User.objects.filter(email=email).exists():
        # 不存在则返回错误状态和提示
        return JsonResponse({"msg": "该邮箱未注册"}, status=400)
    o = generateOTP()
    # 此处保留你原有发送邮件的逻辑
    print(o)
    # 注意:直接返回OTP到前端存在严重安全风险,优化建议见后文
    return HttpResponse(o)

如果你使用的是自定义用户模型,把上面导入的User替换为你自定义的用户类即可。

3 调整前端逻辑适配校验结果

当前前端只要请求状态成功就直接显示OTP输入框,需要新增错误场景的处理:

function ajax_send_otp(){
    email = document.getElementById("email");
    $.post("/send_otp",
        {
            "email":email.value,
            "csrfmiddlewaretoken":"{{csrf_token}}"
        },
        function(data, status){
            if(status=="success"){
                otp_from_back = data;
                document.getElementById("email_div").style.display='none';
                document.getElementById("otp_div").style.display='block';
            }
        }
    ).fail(function(res){
        // 处理邮箱不存在的错误
        document.getElementById("verify_text_div").style.color="red";
        document.getElementById("verify_text_div").innerHTML= res.responseJSON.msg;
        document.getElementById("email_div").style.display='block';
    });
}

安全优化建议

  • 现有方案把OTP明文返回给前端、由前端做校验的逻辑风险极高,恶意用户可以直接抓包获取OTP值跳过邮件校验。建议将生成的OTP存储在服务端session中(request.session['otp'] = o,同时设置过期时间),OTP校验接口在后端比对用户输入的值和session中存储的OTP,不要把OTP暴露到前端。
  • 建议添加OTP发送频率限制,避免接口被恶意调用发送垃圾邮件。
  • OTP需要设置有效期,超过5分钟未校验自动失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:18:03