在 Django Rest 框架中使用 customUser 进行电子邮件登录时出现问题

问题描述 投票:0回答:1

我正在开发一个学校项目,我基本上有一个登录问题,无论我做了多少次操作,我都无法使其工作,它总是显示我的查询与任何现有用户都不匹配(如果它是正确的电子邮件/密码组合)

自定义用户模型:

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 小时了

python django django-rest-framework django-views django-authentication
1个回答
0
投票

类 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)
© www.soinside.com 2019 - 2024. All rights reserved.