Подтвердить что ты не робот

Django-rest-framework http put с ошибкой 415 на django 1.5

Я использую django-rest-framework (последний) для REST API и реализовал несколько тестовых примеров в django, используя встроенный тестовый клиент.

следующий тестовый случай django отлично работал с версией django < 1.5

self.client.put('/core/accounts/%s/'% self.account.id,
        data = prepare_dict(self.account),
        HTTP_AUTHORIZATION=self.token)

обновлено до django 1.5, все тесты проходят, за исключением тестов, связанных с HTTP PUT при просмотре проблемы нашлось это @https://docs.djangoproject.com/en/dev/releases/1.5/#options-put-and-delete-requests-in-the-test-client

Если вы использовали параметр данных в запросе PUT без content_type, вы должны закодировать свои данные, прежде чем передавать их на тест клиента и задайте аргумент content_type.

Итак, обновил мой тест, чтобы отразить это изменение и попытался следовать, но все же получаю http 415 вместо http 200

from django.test.client import MULTIPART_CONTENT, BOUNDARY, encode_multipart
self.client.put('/core/accounts/%s/'% self.account.id,
            data = encode_multipart(BOUNDARY, prepare_dict(self.account)),
                content_type=MULTIPART_CONTENT,
        HTTP_AUTHORIZATION=self.token)

Любая идея, что мне не хватает? P.S: Вся функциональность работает отлично от встроенного веб-интерфейса django-rest-framework

4b9b3361

Ответ 1

Вы абсолютно на правильном пути - тест на разрыв в этом случае, конечно, объясняется изменением Django в PUT для тестового клиента.

Ваше исправление тоже выглядит для меня. 415 - это ответ "Неподдерживаемый тип носителя", что означает, что тип содержимого запроса не был обработан каким-либо из парсеров, настроенных для представления.

Обычно в таком случае это должно быть из-за забывания установить тип содержимого запроса, но похоже, что у вас это правильно установлено на multipart/form-data; boundary=...

Что нужно проверить дважды:

  • Что именно отображается response.data как информация об ошибке?
  • Что вы настроили в настройке DEFAULT_PARSER_CLASSES, если она у вас есть, или что вы установили в атрибуте вида parser_classes, если он есть?
  • Убедитесь, что в тесте не было опечатки в content_type (даже если оно верно здесь).

Edit

Спасибо за ваши комментарии - это все облегчает. У вас только есть парсер JSON, но вы пытаетесь отправить данные в формате Form. Вы должны либо:

  • Добавьте FormParser и MultiPartParser в свои настройки/просмотр, чтобы он поддерживал кодировки форм. (Заметим также, что параметр по умолчанию DEFAULT_PARSER_CLASSES включает их, поэтому, если вы ничего не настроите, он будет работать как ожидалось)

или

  • Кодировать запрос с использованием json кодирования, а не кодирования... data=json.dumps(prepare_dict(self.account)), content_type='application/json' в тестовом примере.