Django authenticate身份验证始终返回not found该如何解决?
Django authenticate身份验证失败排查及解决方案
错误原因及修复方案
- 代码缩进错误
你提供的views.py代码中return语句缩进层级错误,与def loginf(request)同级,不属于函数体内代码,会先触发语法异常。需要先修正缩进,将return语句放在函数内部。 - 用户创建方式不符合规范
如果创建用户时直接调用User.objects.create()方法,密码会以明文形式存储在数据库,而authenticate方法会自动将传入的明文密码做哈希运算,再和数据库存储的哈希值对比,必然匹配失败。正确的用户创建方式为调用create_user方法,该方法会自动对密码做pbkdf2_sha256哈希后存储:
from django.contrib.auth.models import User User.objects.create_user(username="ph", password="mypassword")
- 用户账号状态异常
检查对应用户的is_active字段是否为True,账号被禁用时authenticate默认会返回None。你可以在Django shell中执行以下代码校验账号和密码有效性:
python manage.py shell
进入shell后执行:
from django.contrib.auth.models import User user = User.objects.get(username="ph") # 输出True说明密码正确,输出False说明数据库存储的密码和输入不匹配 print(user.check_password("mypassword")) # 输出True说明账号正常可用,输出False说明账号被禁用 print(user.is_active)
- 认证相关配置缺失
检查settings.py中的配置项:
- 确保
INSTALLED_APPS中包含django.contrib.auth和django.contrib.contenttypes两个内置应用 - 确保配置了默认的认证后端:
AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', ]
- 如果你使用了自定义用户模型,需要确认配置了
AUTH_USER_MODEL = "你的应用名.自定义用户模型类名",否则认证系统会默认查询内置User表,无法匹配自定义用户表中的数据。
- authenticate方法参数缺失
部分Django版本以及自定义认证场景下,需要传入request对象作为第一个参数,修改认证调用代码为:
user = authenticate(request, username=username, password=password)
修正后的完整示例代码
views.py
from django.contrib.auth import authenticate from django.shortcuts import render def loginf(request): username = "ph" password = "mypassword" user = authenticate(request, username=username, password=password) if user is not None: print(user) else: print("not found") return render(request,'myapp/login.html')
urls.py
你提供的urls.py代码无逻辑错误,可正常使用。
内容的提问来源于stack exchange,提问作者praveen kumar
相关产品推荐
相关产品推荐

