2

I am using django rest framework djoser authentication. So what i want is when user login, it will return their user token, promptmsg, status, first_name and last_name.

djoser: http://djoser.readthedocs.io/en/latest/introduction.html

Now i am able to display the token , promptmsg and status but as for the first_name and last_name, i have error trying to do it.

serializers

    class TokenCreateSerializer(serializers.Serializer):
    password = serializers.CharField(
        required=False, style={'input_type': 'password'}
    )

    default_error_messages = {
        'invalid_credentials': constants.INVALID_CREDENTIALS_ERROR,
        'inactive_account': constants.INACTIVE_ACCOUNT_ERROR,
    }

    def __init__(self, *args, **kwargs):
        super(TokenCreateSerializer, self).__init__(*args, **kwargs)
        self.user = None
        self.fields[User.USERNAME_FIELD] = serializers.CharField(
            required=False
        )

    def validate(self, attrs):
        self.user = authenticate(
            username=attrs.get(User.USERNAME_FIELD),
            password=attrs.get('password')
        )

        self._validate_user_exists(self.user)
        self._validate_user_is_active(self.user)
        return attrs

    def _validate_user_exists(self, user):
        if not user:
            self.fail('invalid_credentials')

    def _validate_user_is_active(self, user):
        if not user.is_active:
            self.fail('inactive_account')

customviews.py

class CustomTokenCreateView(cutils.ActionViewMixin, generics.GenericAPIView):
"""
Use this endpoint to obtain user authentication token.
"""
    serializer_class = TokenCreateSerializer
    permission_classes = [permissions.AllowAny]

    def _action(self, serializer):
        token = utils.login_user(self.request, serializer.user)
        token_serializer_class = settings.SERIALIZERS.token
    content = {
            'Token': token_serializer_class(token).data["auth_token"],
            'promptmsg': 'You have successfully login',
            'status': '200',
            'first_name': self.request.user.first_name,
            'last_name': self.request.user.last_name
        }
        return Response(
            data=content,
            status=status.HTTP_200_OK,
        )

This code will give an error :

AttributeError at /logintest/
    'AnonymousUser' object has no attribute 'first_name'

Is there a way to fix this ?

Jin Nii Sama
  • 707
  • 1
  • 16
  • 33

1 Answers1

3

Authentication request does not contain authentication token in it's header, that's why request.user return AnonymousUser object. To fix this error you need to replace request.user with serializer.user like this:

content = {
        'Token': token_serializer_class(token).data["auth_token"],
        'promptmsg': 'You have successfully login',
        'status': '200',
        'first_name': serializer.user.first_name,
        'last_name': serializer.user.last_name
    }
neverwalkaloner
  • 46,181
  • 7
  • 92
  • 100