Django Authentication Form验证后无法正常认证问题
未触发表单验证就读取
cleaned_data
Django表单的cleaned_data只有在调用is_valid()方法通过验证后才会填充正确的过滤后数据。如果跳过验证直接读取cleaned_data,拿到的要么是空字典,要么是未经过滤的错误值,传给authenticate必然返回None。
正确的代码流程:form = AuthenticationForm(request, data=request.POST) if form.is_valid(): # 只有验证通过后才能安全读取cleaned_data username = form.cleaned_data['username'] password = form.cleaned_data['password'] user = authenticate(username=username, password=password) # 处理登录逻辑表单字段与认证参数不匹配
如果你自定义了AuthenticationForm,比如将登录标识从默认的username改成了email,但调用authenticate时还是传入username=form.cleaned_data['username'],就会因为参数不匹配导致认证失败。
这种情况要么在调用authenticate时传入正确的字段值(比如username=form.cleaned_data['email'],前提是你的认证后端支持用邮箱作为用户名参数),要么修改表单字段名与默认保持一致。表单清洗逻辑修改了认证参数
如果重写了AuthenticationForm的clean_username、clean_password或clean方法,不小心修改了字段的值(比如对用户名做了strip()处理,但数据库中存储的用户名包含空格),会导致cleaned_data中的值与数据库记录不匹配,authenticate自然找不到用户。
检查你的表单清洗方法,确保没有意外修改用于认证的核心参数。表单初始化参数错误
Django自带的AuthenticationForm初始化时需要传入request作为第一个参数,如果只传data=request.POST,会导致表单内部的验证逻辑异常,进而影响cleaned_data的生成。
正确的初始化方式要包含request:form = AuthenticationForm(request, data=request.POST)
内容的提问来源于stack exchange,提问作者usama hussain

