【问题标题】:Trying to parse `request.body` from POST in Django [duplicate]尝试从 Django 中的 POST 解析`request.body` [重复]
【发布时间】:2015-06-29 01:51:54
【问题描述】:

由于某种原因,我无法弄清楚为什么 Django 没有正确处理我的 request.body 内容。

它以JSON 格式发送,查看开发工具中的Network 选项卡将其显示为请求负载:

{creator: "creatorname", content: "postcontent", date: "04/21/2015"}

这正是我希望将其发送到我的 API 的方式。

在 Django 中,我有一个视图接受此请求作为参数,并且仅出于我的测试目的,应该将 request.body["content"] 打印到控制台。

当然,什么都没有打印出来,但是当我打印 request.body 时,我得到了这个:

b'{"creator":"creatorname","content":"postcontent","date":"04/21/2015"}'

所以我知道我确实有一个身体正在发送。

我尝试过使用json = json.loads(request.body) 也无济于事。在设置该变量后打印json 也不会返回任何内容。

【问题讨论】:

    标签: python json django python-3.x backbone.js


    【解决方案1】:

    在 Python 3.0 到 Python 3.5.x 中,json.loads() 将只接受 unicode 字符串,因此您必须先解码 request.body(这是一个字节字符串),然后再将其传递给 json.loads()

    body_unicode = request.body.decode('utf-8')
    body = json.loads(body_unicode)
    content = body['content']
    

    在 Python 3.6 中,json.loads() accepts bytes or bytearrays。因此,您不需要解码 request.body(假设它以 UTF-8、UTF-16 或 UTF-32 编码)。

    【讨论】:

    • 这解决了我的问题!访问元素的工作方式类似于body['keyname']。非常感谢。
    • 经过无数个夜晚,这非常有见地
    • 谢谢。我只对一个环境有同样的问题,事实证明有问题的环境是使用 py3.5
    • 它不起作用,我得到了同样的错误。
    • @DerekPK 请提出一个新问题并附上您的代码和完整的错误消息,以便其他用户看到。我认为您不会在此处的 cmets 中获得帮助。
    猜你喜欢
    • 2020-03-27
    • 2017-01-22
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2016-11-26
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多