Django自定义认证后端报错:authenticate方法缺少必填参数‘self’
解决Django自定义认证后端的登录问题
问题1:调用authenticate时缺少self参数
你直接通过类OwnAuthBackend调用了实例方法authenticate,这必然会报错——实例方法需要先创建类的实例才能调用,更规范的做法是用Django官方提供的django.contrib.auth.authenticate()函数,它会自动帮你处理认证后端的实例化和方法调用。
别再手动调用类方法了,先修改视图里的代码:
from django.contrib.auth import authenticate, login # 别漏了导入login函数 # 替换原来的OwnAuthBackend.authenticate调用逻辑 user = authenticate(request, email=email, password=password)
authenticate函数会自动遍历你在settings.py里配置的AUTHENTICATION_BACKENDS列表,找到你的OwnAuthBackend并调用它的authenticate方法,完全不需要你手动处理实例化的问题。
另外,你的后端authenticate方法参数也不符合Django规范,第一个参数应该是request(可选但建议添加),再跟进其他认证参数,修改后端代码:
def authenticate(self, request, email=None, password=None): # 新增request参数 try: user = Users.objects.get(email=email) if user.check_password(password): return user else: return None except Users.DoesNotExist: # 你之前日志里写错了变量名,把login改成email logging.getLogger("error_logger").error(f"user with email {email} does not exist") return None except Exception as e: logging.getLogger("error_logger").error(repr(e)) return None
问题2:登录后会话无法保留
就算验证通过了用户,你也必须调用login()函数把用户信息存入会话,否则Django不会识别当前用户已登录。完善视图的登录逻辑:
from django.contrib.auth import authenticate, login from django.contrib import messages from django.shortcuts import redirect # ... 获取form的email和password之后的逻辑 user = authenticate(request, email=email, password=password) if user is not None: login(request, user) # 关键步骤:调用login创建用户会话 messages.success(request, 'You logged in successfully!') return redirect('index') else: messages.warning(request, 'Credentials were wrong. Failed to log in!') return redirect('index')
额外的细节修正
- 你的
get_user方法里日志格式化有问题,没有传入user_id参数,修改成:
logging.getLogger("error_logger").error(f"user with ID {user_id} not found") # 或者用%格式化方式 logging.getLogger("error_logger").error("user with ID %d not found" % user_id)
- 确保在
settings.py里配置了自定义认证后端:
AUTHENTICATION_BACKENDS = [ 'main.backends.OwnAuthBackend', # 如果需要兼容默认用户认证,可以保留这一行 'django.contrib.auth.backends.ModelBackend', ]
- 如果你的
Users模型替换了Django默认用户模型,记得在settings.py里配置:
AUTH_USER_MODEL = 'main.Users'
做完这些修改后,你的登录功能应该就能正常工作,用户会话也会被正确保留了。
内容的提问来源于stack exchange,提问作者max Nomarkl
相关产品推荐
相关产品推荐

