Django登录报错:EmailBackEnd.authentication()缺少request参数求排查
解决登录错误:EmailBackEnd.authentication() 缺少request参数
核心错误原因及修复
- 认证后端方法名拼写错误
你的EmailBackEnd类里定义的方法是authentication,但Django认证后端要求的标准方法名是**authenticate**(少一个字母t)。这个拼写错误不仅导致Django无法识别合法的认证方法,直接调用类方法时也会出现参数传递异常。
修改EmailBackEnd.py中的方法名:
from django.contrib.auth import get_user_model from django.contrib.auth.backends import ModelBackend class EmailBackEnd(ModelBackend): # 将 authentication 改为 authenticate def authenticate(self, request, username=None, password=None, **kwargs): UserModel = get_user_model() try: user = UserModel.objects.get(email=username) except UserModel.DoesNotExist: return None else: if user.check_password(password): return user return None
- 错误直接调用类方法
视图中直接调用EmailBackEnd.authentication()不符合Django认证流程,正确做法是使用Django内置的authenticate()函数,它会自动调用你配置的认证后端完成验证。
修改views.py中的登录逻辑(先补全函数定义):
from django.contrib.auth import authenticate, login, logout from django.http import HttpResponse def user_login(request): if request.method != "POST": return HttpResponse("<h2>Method Not Allowed</h2>") else: # 使用Django内置authenticate函数 user = authenticate( request, username=request.POST.get("email"), password=request.POST.get("password"), ) if user is not None: login(request, user) return HttpResponse( f"Email : {request.POST.get('email')} | Password : {request.POST.get('password')}" ) else: return HttpResponse("Invalid Login")
- 配置认证后端
在项目的settings.py中添加自定义认证后端,让Django识别你的登录逻辑:
AUTHENTICATION_BACKENDS = [ 'school_system.EmailBackEnd.EmailBackEnd', 'django.contrib.auth.backends.ModelBackend', # 保留默认后端可选 ]
其他代码问题修复
- GetUserDetails视图错误:
request.email.user是无效写法,应改为request.user.email,同时用is_authenticated判断登录状态更规范:def GetUserDetails(request): if request.user.is_authenticated: return HttpResponse( f"User : {request.user.email} | UserType : {request.user.user_type}" ) else: return HttpResponse("Please login first") - urls.py错误:存在重复空路径和无效字符,修正后:
from django.urls import path from . import views urlpatterns = [ path("", views.base, name="base"), path("login", views.LoginPage, name="login"), path("get_user_details", views.GetUserDetails, name="get_user_details"), path("logout_user", views.logout_user, name="logout_user"), path("user_login", views.user_login, name="user_login"), ]
内容的提问来源于stack exchange,提问作者King Iboy
相关产品推荐
相关产品推荐

