Фреймворк Django Rest, возвращающий 403, запрещен при редактировании пользователя, но работает, если пользователь не вошел в систему как любой пользователь

#javascript #python #django #django-rest-framework #http-status-code-403

#javascript #python #django #django-rest-framework #http-status-code-403

Вопрос:

Я пытаюсь сделать запрос PUT в моей пользовательской модели для редактирования имени пользователя, биографии и т. Д., Используя интерфейс Django Rest с React.

Когда я делаю запрос PUT по URL-адресу через клиент django rest, он работает без проблем. Из интерфейса, когда я не зарегистрирован ни у одного пользователя django, я могу отправить запрос PUT через AXIOS без проблем.

Как только я войду в любой пользователь django, даже с правами суперпользователя, я получаю ошибку 403 Forbidden в моем запросе PUT.

Вот мой views.py:

 class RetrieveUpdateDestroyUser(RetrieveUpdateDestroyAPIView):

    serializer_class = UserCreateUpdateSerializer
    queryset = CustomUser.objects.all()
    lookup_field = 'id'
    permission_classes = (AllowAny,)

    def update(self, request, *args, **kwargs):
        """
        PUT and UPDATE requests handled by this method.
        """
        return super().update(request, *args, **kwargs)
  

В моем интерфейсе я делаю запрос PUT (запрос put выполняется с помощью axios):

 export class UserProxy extends BackendProxy {

    updateUser(updatedUser, userID) {
  
        let parameters = `user/${userID}`
        return new Promise((resolve, reject) => {
            this.putRequest(updatedUser, parameters)
                .then(response => { resolve(response) })
                .catch(error => {
                    console.log(error)
                    reject(error)
                })
        });
    }
}  

Просто очень смущен тем, почему я не получаю 403 запрещено, когда я не вошел в систему пользователя django, но я делаю, когда я вошел в систему. Я использую Python-Social-Auth также для входа в систему, если это имеет значение.

Спасибо!

Ответ №1:

Одна вещь, которая может вызвать это, — это если вы используете SessionAuthentication. Анонимные пользователи получают «аутентификацию» на ранних этапах процесса аутентификации. Аутентифицированные пользователи проходят дополнительную проверку CSRF. Если это не удается, выдается HTTP 403.

В моем случае я понял, что должен использовать GET, а CSRF не применяется (https://www.django-rest-framework.org/topics/ajax-csrf-cors/#csrf-protection ).

Комментарии:

1. Очень признателен, я в конечном итоге решил эту проблему, и, как вы сказали, это была проблема CSRF. Если кто-то еще ищет ответ, он находится в моем профиле