【发布时间】:2018-11-08 10:55:40
【问题描述】:
我遇到了一些问题,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 相关的特定问题?
【问题讨论】:
-
因为您可以为同一个键传递两个值,例如:
curl -X POST --data "some_float=1.23456789012123123" --data "some_float=3.14" "http://localhost:8000/myview"。这就是他们最初构建QueryDict的本质原因。 -
但是 request.data 不应该总是一个 QueryDict 实例吗?
-
它是,只是因为你在这里将它转换为a
dict,它当然是一个字典。 -
不,不是。
type(request.data) is dict在本地测试时返回 True,如我的问题中所述。
标签: python django django-rest-framework django-webtest