Json解析django rest框架

Posted

技术标签:

【中文标题】Json解析django rest框架【英文标题】:Json parsing django rest framework 【发布时间】:2017-03-19 17:51:07 【问题描述】:

我想在 django views.py 文件中解析传入的POST 数据

发布数据:


"number" : "17386372",
"data" : ["banana","apple","grapes" ]  

这是我尝试使用request 读取上述传入数据的方式

views.py

class Fruits(APIView):

def post(self, request, format=None):

   if request.method == "POST":

        number = request.data.get('number')
        fruits_data = json.loads(request.body)

        if number not in [None, '', ' ']:
            try:

                response = "return": "OK","data":fruits_data['data']
                return Response(response)
            except:
                return Response("return": "NOT OK")
        else:
            return Response("return": "NOT OK")

    else:
        return Response("return": "NOT OK")

错误:

You cannot access body after reading from request's data stream

【问题讨论】:

选项1:首先json.loads,然后提取'number'。选项 2:from copy import deepcopymy_copy = deepcopy(request) 在破坏原始对象之前。 【参考方案1】:

Django json 解析器已经为您完成了这项工作:

from rest_framework import parsers

class Fruits(APIView):
    parser_classes = (parsers.JSONParser,)

    def post(self, request, format=None):
        number = request.data['number']
        fruits = request.data['data']

如果您的 http 请求的 Content-Type 已经正确设置为 application/json,您甚至不需要指定解析器。

【讨论】:

【参考方案2】:

request.data 和 request.body 是两种机制,读取原始的http请求并以适合python环境使用的格式构造数据。这里的问题是您同时使用它们。因此,http 连接的输入流已经被 request.data 调用读取。现在 request.body 也尝试访问同一个流,它现在不包含任何数据。因此,它抛出了一个错误。

对你来说,我认为下面的代码会起作用:

fruits_data = json.loads(request.body)
number = fruits_data["number"]

【讨论】:

以上是关于Json解析django rest框架的主要内容,如果未能解决你的问题,请参考以下文章

django rest api:JSON 解析错误 - 无法解码 JSON 对象

python-django rest framework框架之解析器

django框架下的JSON解析

使用 Django REST 框架进行批量 POST 时检查记录是不是存在

rest framework之解析器

Django REST framework之解析器实例以及源码流程分析