我正在开发一个学校项目,我基本上有一个登录问题,无论我做了多少次操作,我都无法使其工作,它总是显示我的查询与任何现有用户都不匹配(如果它是正确的电子邮件/密码组合)
自定义用户模型:
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_("email address"), unique=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(auto_now_add=True)
is_company = models.BooleanField(blank=True,null=True)
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
自定义电子邮件后端:
class EmailBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = UserModel.objects.get(Q(email__iexact=username))
except UserModel.DoesNotExist:
UserModel().set_password(password)
except MultipleObjectsReturned:
return CustomUser.objects.filter(email=username).order_by('id').first()
else:
if user.check_password(password) and self.user_can_authenticate(user):
return user
def get_user(self, user_id):
try:
user = UserModel.objects.get(pk=user_id)
except UserModel.DoesNotExist:
return None
return user if self.user_can_authenticate(user) else None
登录视图
class LoginAPIView(APIView):
def post(self,request):
serializer = LoginSerializer(data = request.data)
if serializer.is_valid():
email = serializer.validated_data["email"]
password = serializer.validated_data["password"]
user = authenticate(request, username=email, password=password)
if user is not None:
#We are reterving the token for authenticated user.
token = Token.objects.get(user=user)
response = {
"status": status.HTTP_200_OK,
"message": "success",
"data": {
"Token" : token.key
}
}
return Response(response, status = status.HTTP_200_OK)
else :
response = {
"status": status.HTTP_401_UNAUTHORIZED,
"message": "Invalid Email or Password",
}
return Response(response, status = status.HTTP_401_UNAUTHORIZED)
response = {
"status": status.HTTP_400_BAD_REQUEST,
"message": "bad request",
"data": serializer.errors
}
return Response(response, status = status.HTTP_400_BAD_REQUEST)
登录序列化器:
class LoginSerializer(serializers.ModelSerializer):
email = serializers.EmailField()
class Meta:
model = CustomUser
fields = ['email','password']
我必须使用令牌身份验证而不是用户名进行电子邮件/密码登录 请帮我解决这个问题,我已经处理了 48 小时了
类 CustomUserManager(BaseUserManager): def create_user(自我,电子邮件,密码=无,**额外字段): 如果没有电子邮件: raise ValueError('必须设置电子邮件字段') 电子邮件 = self.normalize_email(电子邮件) 用户= self.model(电子邮件=电子邮件,**额外字段) 用户.set_password(密码) user.save(using=self._db) 返回用户
def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)