Django令牌和会话身份验证

2024-04-19 04:11:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为自定义用户模型创建一个登录名,该模型可以与django配合使用,现在我尝试将其转换为Rest

它正在创建令牌,但不返回令牌,会话也为空

(生成令牌但serializer.data为空)enter image description here

(会话数据库为空)enter image description here

djangoSerializer.py

class UserLoginSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
    required=False,
    allow_blank=True,
    write_only=True,
    label="Email "
)

password = serializers.CharField(
    required=True,
    write_only=True,
    style={'input_type': 'password'}
)

class Meta(object):
    model = User
    fields = ['email', 'password']

def validate(self, data):
    email = data.get('email', None)
    password = data.get('password', None)

    if not email:
        raise serializers.ValidationError("Please enter email to login.")

    user = User.objects.filter(Q(email=email)).exclude(email__iexact="").exclude(email__isnull=True).distinct()
    if user.exists():
        user1 = authenticate(email=email, password=password)
        if user1 is not None:
            if user1.is_active:
                token, created = Token.objects.get_or_create(user=user1)
                data['token'] = token
            else:
                raise serializers.ValidationError("Account not active.")
        else:
            raise serializers.ValidationError("Invalid credentials.")
    else:
        raise serializers.ValidationError("This email is not valid.")


    return data

Djangoview.py

class UserLogin(views.APIView):
permission_classes = (permissions.AllowAny, )
serializer_class = UserLoginSerializer

def post(self, request):
    serializers = self.serializer_class(data=request.data)
    print(serializers)
    if serializers.is_valid(raise_exception=True):
        print("data", serializers.data)
        return Response(serializers.data, status=status.HTTP_200_OK)
    return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)

Tags: truedataifisemailstatusnotpassword
1条回答
网友
1楼 · 发布于 2024-04-19 04:11:51

您可以在serailizers中添加令牌字段

class UserLoginSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
    required=False,
    allow_blank=True,
    write_only=True,
    label="Email "
)

password = serializers.CharField(
    required=True,
    write_only=True,
    style={'input_type': 'password'}
)
token = serializers.SerializerMethodField()

class Meta(object):
    model = User
    fields = ['email', 'password']

def validate(self, data):
    email = data.get('email', None)
    password = data.get('password', None)

    if not email:
        raise serializers.ValidationError("Please enter email to login.")

    user = User.objects.filter(Q(email=email)).exclude(email__iexact="").exclude(email__isnull=True).distinct()
    if user.exists():
        user1 = authenticate(email=email, password=password)
        if user1 is not None:
            if user1.is_active:
                token, created = Token.objects.get_or_create(user=user1)
                data['token'] = token
            else:
                raise serializers.ValidationError("Account not active.")
        else:
            raise serializers.ValidationError("Invalid credentials.")
    else:
        raise serializers.ValidationError("This email is not valid.")


    return data
    def get_token(self, obj):
        try:
            return Token.objects.get(user=obj).key
        except:
            return ''


相关问题 更多 >