Невозможно установить cookie с помощью вызова AJAX в API DRF - PullRequest
0 голосов
/ 07 марта 2019

У меня есть Django Rest API, который устанавливает cookie в объекте ответа. Когда я нажимаю на свой доступный для просмотра API, браузер сохраняет куки в разделе «Приложения»> «Куки». Когда я пытаюсь воспроизвести тот же результат с помощью вызова AJAX, файл cookie не сохраняется автоматически; хотя я получаю объект ответа в вызове AJAX.

Мой код выглядит следующим образом

views.py

class UserLogin(generics.GenericAPIView):
    serializer_class = serializers.UserLoginSerializer
    permission_classes = (
        permissions.AllowAny,
    )

    def finalize_response(self, request, *args, **kwargs):
        """
        Set Authorization in cookie.
        """
        response_obj = super(UserLogin, self).finalize_response(
            request, *args, **kwargs)
        if request.POST and response_obj.status_code == 200:
            response_obj['Authorization'] = 'Token '\
                + response_obj.data['auth_token']
            print 'COOKIE NOT SET'
            response_obj.set_cookie(
                'Authorization', response_obj['Authorization'])
            print 'COOKIE SET'
        return response_obj

    def post(self, request):
        """
        If serializer is valid.
            - call action.
        """
        serializer = self.get_serializer(
            data=request.data)
        if serializer.is_valid():
            user = serializer.validated_data.get('user')
            token, boolean = Token.objects.get_or_create(user=user)
            if not boolean:
                token.created = datetime.datetime.now()
                token.save()
            # user.login_attempts = 0
            user.save()
           data = serializers.TokenSerializer(token).data
            return response.Response(
                data=data,
                status=status.HTTP_200_OK,)
        return response.Response(
            data=serializer.errors,
            status=status.HTTP_400_BAD_REQUEST)

serializers.py

class UserLoginSerializer(serializers.Serializer):

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

    password = serializers.CharField(
        style={'input_type': 'password'})

    def validate(self, data):
        username = data.get(User.USERNAME_FIELD).lower()
        password = data.get('password')

        try:
            user = User.objects.get(username=username)
        except:
            raise serializers.ValidationError(
                messages.INVALID_CREDENTIALS_ERROR)
        data['user'] = user
        user_service = UserService()
        is_valid = user_service.verify_account(user, password)
        if not is_valid:
            raise serializers.ValidationError(
                messages.INACTIVE_ACCOUNT_ERROR)
        return data

    class Meta:
        fields = (User.USERNAME_FIELD, 'password')

Ajax Call

$(document).ready(function() {

   $('form').submit(function(event) {


       var formData = {
           'username'              : $('input[name=username]').val(),
           'password'             : $('input[name=password]').val(),

       };

       // process the form
       $.ajax({
           type        : 'POST', 
           url         : 'http://13.232.122.165/users/login/', 
           data        : formData, 
           dataType    : 'json', 
           encode          : true
       })
           // using the done promise callback
           .done(function(data) {

               // log data to the console so we can see
               console.log(data); 
               location.href = "localhost:5000/profile"
               // here we will handle errors and validation messages
           });

       // stop the form from submitting the normal way and refreshing the page
       event.preventDefault();
   });

});

1 Ответ

0 голосов
/ 07 марта 2019

Файл cookie прикреплен, но вы не можете увидеть его из инструментов разработчика, если не находитесь в домене URL запроса. Попробуйте войти в систему, используя ajax и нажав URL-адрес запроса (любую конечную точку) в браузере, вы увидите cookie.

...