2

代码按原样工作,我只是希望有人可以在这里提供解释。

我为我的应用程序设置了一个自定义后端。下面的代码:

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


class AuthenticationBackend(BaseBackend):
    def authenticate(self, request, username=None, password=None, email=None):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=email)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user
        return None

这是视图:

def login_view(request):

    form = LoginForm(request.POST or None)
    if request.POST and form.is_valid():
        user = form.login(request)
        if user:
            user.backend = 'django.contrib.auth.backends.ModelBackend'
            login(request, user)
            print(request.user)
            return redirect('tasks')

    context = {
        'form': form
    }

    return render(request, 'users/login/index.html', context)

连同表单(请注意,大部分登录功能都被​​抽象到表单中)

class LoginForm(forms.Form):
    email = forms.CharField(max_length=255, required=True, widget=forms.TextInput(attrs={'class': 'form_input'}))
    password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form_input'}), required=True)

    def clean(self):
        email = self.cleaned_data.get('email')
        password = self.cleaned_data.get('password')
        user = authenticate(email=email, password=password)
        if not user or not user.is_active:
            raise forms.ValidationError("Sorry, that login was invalid. Please try again.")
        return self.cleaned_data

    def login(self, request):
        email = self.cleaned_data.get('email')
        password = self.cleaned_data.get('password')
        user = authenticate(email=email, password=password)
        return user

在 login_view 代码中,我遇到了一个问题。在添加“user.backend = ...”行之前,系统会成功登录用户,但是在重定向到“任务”视图后,用户将返回匿名。

在登录之前为用户指定后端后,代码可以正常工作。

为什么我需要在登录之前为用户指定后端?这是因为我使用的是自定义后端吗?我在某处搞砸了代码吗?

提前谢谢你!

4

1 回答 1

1

实际上,当您在 Django 中创建多个后端并在 Django 设置中注册该后端时,Django 无法识别此登录功能适用于哪个后端,因此我们必须在登录时指定后端,否则您就是可以删除默认的 Django 登录后端,但是,如果你删除它之后,Django 管理员登录可能无法正常工作。

于 2020-10-07T00:43:34.320 回答