Django-为什么在使用自定义后端登录时需要指定user.backend?

Django-为什么在使用自定义后端登录时需要指定user.backend?,django,Django,代码按原样工作,我只是希望有人能在这里提供解释 我为我的应用程序设置了自定义后端。代码如下: 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

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

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

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)
与表单一起使用(注意,大部分登录功能都被抽象到表单中)

在登录视图代码中,我遇到了一个问题。在添加“user.backend=…”行之前,系统将成功登录用户,但是在重定向到“tasks”视图时,用户将返回Anonymous

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

为什么我需要在登录之前为用户指定后端?这是因为我正在使用自定义后端吗?我是不是把密码搞砸了


提前谢谢你

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

哦,我明白了!感谢您的解释:)
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