У меня возникла проблема с тем, что request.data иногда представляет собой dict
(особенно при тестировании), а иногда QueryDict
(при использовании curl).
Это особенно проблема, потому что, по-видимому, существует большая разница при вызове представления с использованием curl, например:
curl -X POST --data "some_float=1.23456789012123123" "http://localhost:8000/myview"
Или используя клиент django_webtest, например:
class APIViewTest(WebTest):
def test_testsomething(self):
self.app.post(url=url, params=json.dumps({some_float=1.26356756467}))
И затем приведение этого QueryDict к диктату, например
new_dict = dict(**request.data)
my_float = float(new_dict['some_float'])
В тестах все работает нормально, поскольку request.data
- это dict
, но в производственной среде представление вылетает, потому что new_dict['some_float']
на самом деле представляет собой список с одним элементом, а не как ожидается, с плавающей точкой.
Я подумал над решением проблемы следующим образом:
if type(request.data) is dict:
new_dict = dict(**request.data)
else:
new_dict = dict(**request.data.dict())
что очень неправильно, так как тесты будут проверять только строку 2, а (некоторые? Все?) Рабочий код будет запускать строку 4.
Поэтому, хотя мне интересно, почему QueryDict ведет себя таким образом, я бы предпочел знать, почему и когда response.data - это QueryDict
. И как я могу использовать тесты Django для имитации этого поведения. Наличие разных условий для производства и тестирования систем всегда проблематично и иногда неизбежно, но в этом случае я чувствую, что это можно исправить. Или это специфическая проблема, связанная с django_webtest?