【问题标题】:Json parsing django rest frameworkJson解析django rest框架
【发布时间】: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) 在破坏原始对象之前。

标签: python arrays json django django-rest-framework


【解决方案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"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-11
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2021-10-22
      • 2021-05-28
      • 2019-03-21
      相关资源
      最近更新 更多