Django登录认证始终返回None问题求助
问题分析与解决方案
核心问题:注册时密码未正确存储
你的登录失效最可能的原因是注册阶段密码没有被正确哈希存储,导致登录时authenticate无法匹配到用户。
Django AbstractUser 的 create_user 方法签名为:
create_user(username, email=None, password=None, **extra_fields)
你当前的注册代码中:
user = User.objects.create_user(username,password)
这里把password当成了第二个参数传递,但该位置对应的是email字段,密码实际没有被传入正确的参数位。最终用户的密码字段没有被哈希处理,反而把密码值赋给了email,导致登录时用真实密码去验证自然失败。
修复代码:
显式指定参数名,确保密码被正确传入:
user = User.objects.create_user(username=username, password=password)
其他潜在问题排查
- 退出函数正确性
确保退出时调用Django官方的logout方法,彻底清理session:
from django.contrib.auth import logout def dlogout(request): logout(request) return redirect('login')
- 表单字段一致性
检查登录模板的表单输入框,确保name属性和视图中request.POST获取的键完全一致:
<form method="POST"> {% csrf_token %} <input type="text" name="username" placeholder="用户名"> <input type="password" name="password" placeholder="密码"> <button type="submit">登录</button> </form>
移除不必要的CSRF豁免
注册函数中的@csrf_exempt建议移除,同时在注册模板中添加{% csrf_token %},避免CSRF防护缺失导致的session异常。验证密码存储状态
可以在注册后打印用户的password字段,正常情况下应该是类似pbkdf2_sha256$...的哈希值,如果是明文,说明密码未被正确处理,确认上述参数问题是否修复。
内容的提问来源于stack exchange,提问作者Ali Kocak
相关产品推荐
相关产品推荐

