简体   繁体   中英

KeyError at /api/login 'user'

This user keyword error is showing in my login api. I am not sure why. I am guessing user instance is not available in the login view. I am new and I dont know the reason.

This is my login view:

class LoginUserView(GenericAPIView):
    permission_classes = [AllowAny]
    serializer_class = UserLoginSerializer

def post(self, request, *args, **kwargs):
    data = request.data
    serializer = UserLoginSerializer(data=data)
    serializer.is_valid(raise_exception=True)
    user = serializer.validated_data["user"]
    token, created = Token.objects.get_or_create(user=user)
    return response.Response({"token": token.key}, status=status.HTTP_200_OK)

This is my serializers:

class UserLoginSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(label='Email Address')

class Meta:
    model = User
    fields = [
'email', 'password',
]
    extra_kwargs = {"password":
{"write_only": True}}

def validate(self, data):
    # user = None
    email = data.get("email", None)
    password = data.get("password")
if not email:
    raise serializers.ValidationError("Email is required for login")
if not password:
    raise serializers.ValidationError("Password is required for login")
user = authenticate(email=email, password=password)
if not user:
    raise serializers.ValidationError("This email is not valid/already exists")
return data

The serializer has no user in its validated data. Note that serializer.validated_data['user'] makes not much sense, since you never passed this to the validator.

You should add it to the data with:

def validate(self, data):
    # user = None
    email = data.get('email', None)
    password = data.get('password')
    if not email:
        raise serializers.ValidationError('Email is required for login')
    if not password:
        raise serializers.ValidationError('Password is required for login')
    user = authenticate(email=email, password=password)
    if not user:
        raise serializers.ValidationError('This email is not valid/already exists')
    
    return data

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM