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