Django登录验证异常求助:输入正确账号密码仍提示错误
Django登录验证失败问题解决
问题分析
输入正确用户名和密码后始终提示认证失败,核心原因有两个:
- 自定义的
registration模型未集成Django认证系统,authenticate函数仅识别符合Django认证规范的用户模型(自带User或继承AbstractUser/AbstractBaseUser的自定义模型)。 - 密码以明文存储,而Django认证系统要求密码必须经过哈希加密,
authenticate会自动对输入密码哈希后与数据库值对比,明文无法匹配。
解决方案
方案一:改用Django自带User模型(快速修复)
1. 修改sign_up视图
替换自定义模型为Django自带User模型,并用系统方法加密密码:
from django.shortcuts import render, HttpResponse, redirect from django.contrib.auth import authenticate, login from django.contrib.auth.models import User def home(request): return render(request,'home.html') def log_in(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('home') else: return HttpResponse("You have incorrect Username or password") return render(request, 'log_in.html') def sign_up(request): if request.method == 'POST': name = request.POST.get('fullname') username = request.POST.get('username') email = request.POST.get('email') pass1 = request.POST.get('password') pass2 = request.POST.get('confirm_password') if pass1 != pass2: return HttpResponse("Password not matched") else: # 使用Django自带User模型创建用户,自动加密密码 User.objects.create_user( username=username, email=email, password=pass1, first_name=name ) return redirect('log_in') return render(request,'sign_up.html')
2. 清理旧模型
删除models.py中的registration类,执行迁移更新数据库:
python manage.py makemigrations python manage.py migrate
方案二:自定义用户模型(适合需扩展用户字段场景)
1. 修改models.py
让自定义模型继承AbstractUser,集成Django认证系统:
from django.db import models from django.contrib.auth.models import AbstractUser class registration(AbstractUser): Name = models.CharField(max_length=100) Email = models.EmailField(max_length=100, unique=True) # 用EmailField更规范,设为唯一 # 指定认证用的用户名字段 USERNAME_FIELD = 'username' # 注册时必填的额外字段 REQUIRED_FIELDS = ['Email', 'Name']
2. 配置settings.py
告诉Django使用自定义用户模型:
AUTH_USER_MODEL = '你的应用名称.registration' # 替换为实际app名称
注意:该配置必须在首次执行迁移前添加,若已迁移过,建议重置数据库后再执行迁移。
3. 修改sign_up视图
使用自定义模型创建用户,密码自动加密:
def sign_up(request): if request.method == 'POST': name = request.POST.get('fullname') username = request.POST.get('username') email = request.POST.get('email') pass1 = request.POST.get('password') pass2 = request.POST.get('confirm_password') if pass1 != pass2: return HttpResponse("Password not matched") else: registration.objects.create_user( username=username, Email=email, Name=name, password=pass1 ) return redirect('log_in') return render(request,'sign_up.html')
4. 执行迁移
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者Mh Limon
相关产品推荐
相关产品推荐

