Search code examples
pythondjangodjango-rest-frameworkdjango-registrationdjango-rest-auth

Django Token and Session auth


I was creating a Login For Custom User model is work fine with django , now i try to convert into Rest .

It is creating the token but it doesnot return the token and Session is also blank

(generation token but serializer.data is blank) enter image description here

(Session db is empty) enter image description here

django Serializer.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

Django view.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)

Solution

  • You can add token field in the your 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 ''