Заголовок переопределения метода тестового клиента Django

Я пытаюсь проверить мой метод обновления на моем наборе. Viewset - это набор моделей, взятый из drf. Для обновления мне нужно будет отправить запрос на размещение. Поскольку это не всегда поддерживается, есть два способа сообщить серверу, что я делаю запрос на размещение, первый, который не соответствует моим потребностям, - это использовать дополнительное поле для формирования _method и установите его put, Поскольку мне нужно опубликовать данные JSON, мне нужно использовать второй способ, который использует X-HTTP-Method-Override заголовок.

Чтобы опубликовать мои данные в тестовом примере, я использую следующий код:

header = {'X_HTTP_METHOD_OVERRIDE': 'PUT'}
response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)

Но, к сожалению, результат, который я получаю, {'detail':'Method POST not allowed.'}, Я проверил поведение сервера, используя аддон ( Почтальон), где я указал X-HTTP-Method-Override заголовок тоже. Никаких исключений не возникает. Теперь мне нужно знать, как правильно передать заголовок тестовому клиенту django, иначе тестирование будет очень раздражать.

1 ответ

Решение

Вы должны указать заголовок как 'HTTP_X_HTTP_METHOD_OVERRIDE' вместо 'X_HTTP_METHOD_OVERRIDE' т.е. добавить HTTP_ в начале заголовка.

header = {'HTTP_X_HTTP_METHOD_OVERRIDE': 'PUT'}
response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)

Из документации Django:

Заголовки HTTP в запросе преобразуются в META ключи, преобразуя все символы в верхний регистр, заменяя любые дефисы подчеркиванием и добавляя HTTP_ префикс к имени. Так, например, заголовок называется X-Bender будет сопоставлен с META ключ HTTP_X_BENDER,

Также вы можете передавать заголовки в конструктор клиента:

from django.test import Client

client = Client(HTTP_USER_AGENT="Mozilla/5.0 ...", HTTP_X_USER_ID="982734")

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

PS: Этот подход действителен для DRF TestApiClient и ApiRequestFactory.

Другие вопросы по тегам