/doLogin authenticate()处的TypeError缺少1个必需的位置参数:“请求”

2024-04-27 02:55:12 发布

您现在位置:Python中文网/ 问答频道 /正文

这就是我尝试登录时遇到的错误 我真的不知道我的登录代码中是否缺少什么 请帮我复习一下这个代码 这是我的

views.py

import datetime
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from student_management_app.EmailBackEnd import EmailBackEnd

# Create your views here.
def showDemoPage(request):
    return render(request, "demo.html")

def ShowLoginPage(request):
    return render(request, "login_page.html")

def doLogin(request):
    if request.method!="POST":
        return HttpResponse("<h2>Method Not Allowed</h2>")
    else:
        user=EmailBackEnd.authenticate(request,username=request.POST.get("email"),password=request.POST.get("password"))
        if user!=None:
            login(request,user)
            return HttpResponse("Email : "+request.POST.get("email")+ "password

:"+request.POST.get("password")) else: return HttpResponse("Invalid Login")

def GetUserDetails(request):
    if request.user!=None:
        return HttpResponse("User :"+request.user.email+" usertype : "+request.user.user_type)
    else:
        return HttpResponse("Please Login First")

def logout_user(request):
    logout(request)
    return HttpResponseRedirect("/")

EmailBackEnd.py

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend


class EmailBackEnd(ModelBackend):
    def authentication(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

URL.py代码

from django.contrib import admin
from django.urls import path
from django.conf.urls.static import static
from student_management_app import views
from student_management_system import settings

urlpatterns = [
    path('demo', views.showDemoPage),
    path('admin/', admin.site.urls),
    path('', views.ShowLoginPage),
    path('get_user_details', views.GetUserDetails),
    path('logout_user', views.logout_user),
    path('doLogin', views.doLogin)
]+static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)+static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)

Tags: pathdjangofromimportnonegetreturnrequest
2条回答

问题在于电子邮件后端身份验证代码。如果你注意到

class EmailBackEnd(ModelBackend):
    def authentication(self,request username=None, password=None, **kwargs):

请求后缺少一个逗号,应该是

class EmailBackEnd(ModelBackend):
    def authentication(self,request, username=None, password=None, **kwargs):

还应避免直接调用身份验证后端。您应该导入默认的auth后端,并将自定义设置添加到

from django.contrib.auth import authenticate

def doLogin(request):
    if request.method!="POST":
        return HttpResponse("<h2>Method Not Allowed</h2>")
    else:
        user= authenticate(request,username=request.POST.get("email"),password=request.POST.get("password"))
        if user!=None:
            login(request,user)
            return HttpResponse("Email : "+request.POST.get("email")+ "password

并在设置中添加自定义后端,如

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'student_management_app.EmailBackEnd.EmailBackEnd',   
]

这确保django遍历所有后端并使用一个适合您的用例的后端

request作为第一个参数传递。您的第一个参数是self

相关问题 更多 >