首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-rest-framework登录用户

django-rest-framework登录用户
EN

Stack Overflow用户
提问于 2019-07-18 15:36:33
回答 1查看 35关注 0票数 0

我已经为用户注册和登录创建了序列化程序和api端点。一切工作到现在,除了我无法登录时,创建的用户没有电子邮件地址。如果用户有电子邮件地址,我可以通过提交电子邮件或用户名登录,也可以注册一个没有电子邮件地址的用户。这是我的代码:

serializers.py

代码语言:javascript
复制
class UserLoginSerializer(ModelSerializer):
    token = CharField(allow_blank=True, read_only=True)
    username = CharField(required=False, allow_blank=True)
    email = EmailField(label='Email Address', required=False, allow_blank=True)
    class Meta:
        model = User
        fields = [
            'username',
            'email',
            'password',
            'token',
        ]
        extra_kwargs = {"password":{"write_only": True}} 
    def validate(self, data):
        user_obj = None
        email = data.get("email", None)
        username = data.get("username", None)
        password = data["password"]
        if not email and not username:
            raise ValidationError("A username or email is required to login.")
        user = User.objects.filter(
                Q(email=email) |
                Q(username=username)
            ).distinct()
        user = user.exclude(email__isnull=True).exclude(email__iexact='')
        if user.exists() and user.count() == 1:
            user_obj = user.first()
        else:
            raise ValidationError("This username/email is not valid")
        if user_obj:
            if not user_obj.check_password(password):
                raise ValidationError("Incorrect credentials, please try again")
        data["token"] = "SOME RANDOM TOKEN"
        return data

views.py

代码语言:javascript
复制
class UserLoginAPIView(APIView):
    permission_classes = [AllowAny]
    serializer_class = UserLoginSerializer
    def post(self, request, *args, **kwargs):
        data = request.data
        serializer = UserLoginSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data
            return Response(new_data, status=HTTP_200_OK)
        return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
EN

回答 1

Stack Overflow用户

发布于 2019-07-18 16:23:51

我认为这就是问题所在:

代码语言:javascript
复制
 user = user.exclude(email__isnull=True).exclude(email__iexact='')

您排除了没有电子邮件的用户,因此他们显然无法登录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57089349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档