如何在Django登录页面验证数据库中是否存在用户?
Django 用户存在验证功能修复方案
核心问题分析
- 表单提交被干扰:提交按钮的
onclick属性会在表单提交前触发页面跳转,导致POST请求无法正常进入视图的处理逻辑。 - 变量未初始化:视图中
data变量仅在POST请求分支中定义,当GET请求访问页面时会直接抛出NameError。 - 明文密码风险:直接存储和验证明文密码不符合安全规范,容易导致数据泄露。
修复步骤及代码修改
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
相关产品推荐
相关产品推荐

