Django自定义认证后端is_valid触发authenticate调用及相关问题咨询
问题1解答
这是正常行为,并非你的代码存在错误。
出现该现象的原因是你使用的DomainLoginForm大概率继承了Django自带的AuthenticationForm,该表单类默认的clean()校验逻辑中,会自动调用authenticate方法验证用户名和密码的合法性,且默认仅传递username和password两个参数,因此第一次触发时domainname为None。
如果要避免重复调用,可以重写DomainLoginForm的clean方法,移除表单自带的认证逻辑,仅保留字段合法性校验,认证逻辑统一在视图层手动处理即可。
问题2解答
get_user方法是Django认证系统要求所有自定义后端必须实现的标准方法,作用是通过用户主键ID获取对应的用户实例对象。
你观测到的现象符合设计逻辑:authenticate方法仅在主动触发登录校验时调用,而get_user的调用场景是:
- 登录完成后,Django将用户ID存入session,后续每次请求需要从session中加载当前登录用户时,都会调用
get_user方法获取对应用户实例 - 所有需要通过用户ID反查用户对象的Django内置逻辑(比如Admin后台权限校验、用户关联数据查询等),都会调用该方法
如果不实现get_user方法,登录后用户会话会失效,无法正常访问需要登录态的页面。
内容的提问来源于stack exchange,提问作者Tomasz Szkudlarek
相关产品推荐
相关产品推荐

