【问题标题】:Django Test Client squishes nested JSONDjango 测试客户端压缩嵌套的 JSON
【发布时间】:2012-06-19 15:02:09
【问题描述】:

我遇到的问题与Django's Querydict bizarre behavior: bunches POST dictionary into a single keyUnit 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:然后我尝试,添加内容类型参数如下:

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')

我现在得到的 request.POST 是

<QueryDict: {u"{'deviceInfo': {'deviceType': 'I', 'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067'}, 'pinNumber': 5541, 'phoneNumber': u' 15551234567'}": [u'']}>

我想要做的就是能够为我的请求数据指定一个嵌套的字典。有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: django django-testing


    【解决方案1】:

    我的解决方案如下:

    在测试方法中:

    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。

    谢谢。

    【讨论】:

      【解决方案2】:

      以下对我有用(使用命名参数):

      geojson = {
              "type": "Point",
              "coordinates": [1, 2]
          }
      
          response = self.client.post('/validate', data=json.dumps(geojson),
                                      content_type='application/json')
      

      【讨论】:

      • JSON.dumps 是最好的方法。这应该是公认的答案。
      • 但这不适用于带有嵌套字典的多部分表单数据。
      【解决方案3】:

      您的问题表明 Django 将您的请求解释为 multipart/form-data 而不是 application/json。试试

      c.post("URL", "{JSON_CONTENT}", content_type="application/json").

      要注意的另一件事是,Python 在呈现为字符串时使用单引号表示字典键/值,这是 simplejson 解析器不喜欢的。将硬编码的 JSON 对象保留为单引号字符串,在内部使用双引号来解决这个问题...

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-10
        相关资源
        最近更新 更多