我遇到的问题与Django's Querydict bizarre behavior: bunches POST dictionary into a single key和Unit testing Django JSON View非常相似。但是,这些线程中的问题/响应都没有真正指出我遇到的指定问题。我正在尝试使用Django的测试客户端发送带有嵌套JSON对象的请求(我对具有非JSON值的JSON对象有效)。
尝试#1:这是我的初始代码:
response = c.post('/verifyNewMobileUser/',
{'phoneNumber': user.get_profile().phone_number,
'pinNumber': user.get_profile().pin,
'deviceInfo': {'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067', 'deviceType': 'I'}})
如您所见,我的请求数据中有一个嵌套的JSON对象。但是,这就是request.POST的样子:
<QueryDict: {u'phoneNumber': [u'+15551234567'], u'pinNumber': [u'4171'], u'deviceInfo': [u'deviceType', u'deviceID']}>
尝试#2:然后我尝试了,添加了content-type参数,如下所示:
response = c.post('/verifyNewMobileUser/',
{'phoneNumber': user.get_profile().phone_number,
'pinNumber': user.get_profile().pin,
'deviceInfo': {'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067', 'deviceType': 'I'}},
'application/json')
我现在要求的是什么.POST是
<QueryDict: {u"{'deviceInfo': {'deviceType': 'I', 'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067'}, 'pinNumber': 5541, 'phoneNumber': u' 15551234567'}": [u'']}>
我想要做的就是为我的请求数据指定一个嵌套的dict。有一个简单的方法吗?
答案 0 :(得分:16)
以下适用于我(使用命名args):
geojson = {
"type": "Point",
"coordinates": [1, 2]
}
response = self.client.post('/validate', data=json.dumps(geojson),
content_type='application/json')
答案 1 :(得分:6)
您的问题表明Django正在将您的请求解释为multipart/form-data
而不是application/json
。尝试
c.post("URL", "{JSON_CONTENT}", content_type="application/json")
。
另一件需要注意的事情是Python在呈现为字符串时使用单引号表示字典键/值,而simplejson解析器不喜欢它。将您的硬编码JSON对象保持为单引号字符串,使用内部的双引号来解决这个问题......
答案 2 :(得分:0)
我的解决方案如下:
在测试方法中:
data_dict = {'phoneNumber': user.get_profile().phone_number,
'pinNumber': user.get_profile().pin,
'deviceInfo':
{'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067',
'deviceType': 'I'}})
self.client.post('/url/', data={'data': json.dumps(data_dict)})
在视图中:
json.loads(request.POST['data'])
这会将post ['data']作为字符串发送。在视图中必须从该字符串加载json。
感谢。