You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django自定义MyUser模型认证时触发TypeError错误求助

解决Django自定义认证后端中check_password()的TypeError问题

你遇到的这个错误其实是个典型的实例方法调用误区,问题出在调用check_password的方式上——你直接用模型类MyUser来调用这个方法,但check_password是一个实例方法,必须通过具体的用户实例来执行,而不是类本身。

错误原因拆解

看你后端代码里的这行错误代码:

if MyUser.check_password(password):

MyUser是你的用户模型类,而check_password方法需要两个参数:第一个是self(当前用户实例),第二个是待验证的明文密码raw_password。当你直接用类调用时,没有传入用户实例作为第一个参数,Python就会把password当成self,自然就会提示缺少raw_password参数。

修正后的完整后端代码

只需要把判断逻辑改成通过你查询到的user实例来调用check_password即可:

class EmailAuthenticationBackend(ModelBackend):
    def authenticate(self, request, email=None, password=None):
        MyUser = get_user_model()
        try:
            # 查询对应邮箱的用户实例
            user = MyUser.objects.get(email=email)
            # 用实例调用check_password验证密码
            if user.check_password(password):
                return user
        except MyUser.DoesNotExist:
            # 邮箱不存在直接返回None
            return None

补充说明

Django的AbstractBaseUser(你的自定义MyUser应该继承了这个基类)中的check_password方法,需要依赖当前用户实例存储的密码哈希值来验证明文密码,所以必须绑定到具体的用户实例上才能正确工作——它需要读取该实例的password字段值来完成哈希比对。

内容的提问来源于stack exchange,提问作者K. John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:04:54