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

如何在Django登录页面验证数据库中是否存在用户?

Django 用户存在验证功能修复方案

核心问题分析

  1. 表单提交被干扰:提交按钮的onclick属性会在表单提交前触发页面跳转,导致POST请求无法正常进入视图的处理逻辑。
  2. 变量未初始化:视图中data变量仅在POST请求分支中定义,当GET请求访问页面时会直接抛出NameError。
  3. 明文密码风险:直接存储和验证明文密码不符合安全规范,容易导致数据泄露。

修复步骤及代码修改

1. 修正HTML提交按钮

移除按钮上的onclick属性,让表单正常提交POST请求:

<!-- 修改前 -->
<button type="submit"  class="btn btn-primary mt-3" onclick="location.href='{% url 'user_enter' %}'">Enter</button>

<!-- 修改后 -->
<button type="submit" class="btn btn-primary mt-3">Enter</button>

2. 修复视图函数变量初始化

在视图函数开头初始化data变量,避免GET请求时报错:

# views.py
def user_enter(request):
    data = False  # 初始化变量,确保GET请求时也能正常返回
    print("hello")
    if request.method == "POST":
        enter_user_email = request.POST.get('enter_user_email')
        enter_user_pass = request.POST.get('enter_user_pass')
        print(enter_user_pass)
        print(enter_user_email)
        # 验证用户是否存在
        data = User.objects.filter(email_name=enter_user_email, user_password=enter_user_pass).exists()
    return render(request, 'main.html', {'data': data})

3. (可选)添加验证结果提示

在HTML表单下方添加代码,显示验证结果:

<form action="" method="POST">
    <!-- 原有表单内容 -->
</form>

<!-- 添加验证结果提示 -->
{% if data %}
    <div class="alert alert-success mt-3">用户存在!</div>
{% elif request.method == "POST" %}
    <div class="alert alert-danger mt-3">邮箱或密码错误!</div>
{% endif %}

4. 安全优化:密码加密存储与验证

强烈建议不要用明文存储密码,改用Django内置的加密机制:

# 创建用户时加密密码
from django.contrib.auth.hashers import make_password

def user_registration(request):
    if request.method == "POST":
        email = request.POST.get('email')
        password = request.POST.get('password')
        # 加密密码后存储
        user = User(email_name=email, user_password=make_password(password))
        user.save()
    # 后续逻辑...

# 验证时使用check_password
def user_enter(request):
    data = False
    if request.method == "POST":
        enter_user_email = request.POST.get('enter_user_email')
        enter_user_pass = request.POST.get('enter_user_pass')
        user = User.objects.filter(email_name=enter_user_email).first()
        # 验证密码是否匹配
        if user and user.check_password(enter_user_pass):
            data = True
    return render(request, 'main.html', {'data': data})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:27:03