Заголовок переопределения метода тестового клиента 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)
Заголовки 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.