1

我为 Auth Backend 编写了以下类,并将其放在 app 目录内的文件“authentication.py”中:

from events.models import User

class authBackend():
    def authenticate(self, request, username, passwprd):
        try:
            user = User.objects.get(rollNo=username)
            success = user.check_password(password)
            if success:
                return user
        except User.DoesNotExist:
            pass
        return None

    def get_user(self, uid):
        try:
            return User.objects.get(pk=Uid)
        except:
            return None

然后我将它添加(或者至少我认为我做了)它到 settings.py:

AUTHENTICATION_BACKENDS = [
    'events.authentication'
]

这就是我登录用户的方式:

def login_view(request):
    if request.method == "POST":

        # Attempt to sign user in
        rollno = request.POST["rollno"]
        password = request.POST["password"]

        user = authenticate(request, username=rollno, password=password)

        # Check if authentication successful
        if user is not None:
            login(request, user)
            return HttpResponseRedirect(reverse("events:index"))
        else:
            return render(request, "events/login.html", {
                "message": "Invalid roll number and/or password."
            })
    else:
        return render(request, "events/login.html")

但我得到以下追溯:

/login 模块“事件”处的 ImportError 未定义“身份验证”属性/类

我是一个菜鸟,我很确定我做错了什么,我只是不明白它是什么。

有人可以告诉我怎么做吗?

4

1 回答 1

1

您还需要使用类名导入它,因此:

AUTHENTICATION_BACKENDS = [
    'events.authentication.authBackend'
]

在你的authBackend,你也犯了一些错误。首先,身份验证后端需要实现一些功能 [Django-doc]

用户模型及其管理器会将权限查找功能(get_user_permissions()get_group_permissions()get_all_permissions()has_perm()has_module_perms()with_perm())委派给实现这些功能的任何身份验证后端。

因此,您也需要实现此功能。因此,从BaseBackend[Django-doc]继承可能会更好,或者从ModelBackend.

您还在参数名称中打错了字:它是password,不是passwprd

from django.contrib.auth.backends import BaseBackend
from events.models import User

class authBackend(BaseBackend):
    def authenticate(self, request, username, password):
        try:
            user = User.objects.get(rollNo=username)
            success = user.check_password(password)
            if success:
                return user
        except User.DoesNotExist:
            pass
        return None

    def get_user(self, uid):
        try:
            return User.objects.get(pk=Uid)
        except:
            return None

注意:根据PEP-8 样式指南[pep-0008],类名是用PerlCase以大写开头的,因此您可能需要考虑重命名 authBackendAuthBackend.

于 2021-02-27T09:18:10.120 回答