【问题标题】:Django request Post jsonDjango 请求发布 json
【发布时间】:2014-09-17 11:36:43
【问题描述】:

我尝试测试一个视图,我收到一个来自 iPad 的 json 请求,格式是:

req = {"custom_decks": [
        {
            "deck_name": "deck_test",
            "updates_last_applied": "1406217357",
            "created_date": 1406217380,
            "slide_section_ids": [
                1
            ],
            "deck_id": 1
        }
          ],
    "custom_decks_to_delete": []
}

我在 jsonlint 中检查了这个,它通过了。

我通过以下方式发布请求:

response = self.client.post('/library/api/6.0/user/'+ uuid +
'/store_custom_dec/',content_type='application/json', data=req) 

视图返回 "creation_success": false

问题是视图中的 post 方法没有找到关键的 custom_decks。

QueryDict: {u'{"custom_decks": [{"deck_id": 1, "slide_section_ids": [1], 
"created_date":1406217380, "deck_name": "deck_test"}], 
"custom_decks_to_delete": []}': [u'']}>

问题是视图中的 post 方法没有找到关键的 custom_decks。 因为它用一键将我的 dict 转换为 QueryDict。

感谢所有帮助。

谢谢

【问题讨论】:

    标签: json django post django-views httprequest


    【解决方案1】:

    您发布的是 JSON,它与表单编码数据不同。您需要获取request.body 的值并对其进行反序列化:

    data = json.loads(request.body)
    custom_decks = data['custom_decks']
    

    【讨论】:

    • 请求(req),直接写在test方法里,而且是字典,req.body我用不了。我该如何进行?谢谢
    • 该评论毫无意义。您发布了一个字典:它以 JSON 格式接收,您必须对其进行解码。如果该代码不起作用,您应该显示您收到的错误。
    【解决方案2】:

    因为我在直接使用另一个答案的代码从 HttpRequest 获取 JSON 数据时遇到问题:

    data = json.loads(request.body)
    custom_decks = data['custom_decks']
    

    错误:

    the JSON object must be str, not 'bytes'
    

    这是 Python 版本 >3 的另一个答案的更新:

    json_str=((request.body).decode('utf-8'))
    json_obj=json.loads(json_str)
    

    关于decode('utf-8'),如:

    RFC 4627:

    "JSON 文本应以 Unicode 编码。默认编码为 UTF-8。”

    我附上了 Python 链接,提到了版本 >3 的这个特定问题。

    http://bugs.python.org/issue10976

    【讨论】:

      【解决方案3】:

      由于HttpRequest has a read() method从请求中加载JSON其实很简单:

      def post(self, request, *args, **kwargs):
          import json
          data = json.load(request)
          return JsonResponse(data=data)
      

      如果你把它作为一个视图,你可以测试它,它会回显你发回给你的任何 JSON。

      【讨论】:

        【解决方案4】:

        python 3.6django 2.0

        post_json = json.loads(request.body)
        custom_decks = post_json.get("custom_decks")
        

        json.loads(s, *, encoding=None,...)

        在版本 3.6 中更改:s 现在可以是 bytesbytearray 类型。输入编码应为UTF-8UTF-16UTF-32

        来自python 3.6 不需要 request.body.decode('utf-8').

        【讨论】:

          猜你喜欢
          • 2018-10-19
          • 2012-09-26
          • 2020-10-30
          • 2020-12-11
          • 2018-10-14
          • 2015-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多