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
相关产品推荐
相关产品推荐

