DRF中的request.data与Django中的request.body

时间:2016-04-14 07:22:15

标签: python django django-rest-framework

Django REST框架引入了一个扩展常规HttpRequest的Request对象,这个新对象类型有request.data来访问JSON数据,用于' POST' PUT'和' PATCH'要求。

但是,我可以通过访问request.body参数来获取相同的数据,该参数是原始Django HttpRequest类型对象的一部分。

我看到的一个区别是request.data只能访问一次。此限制不适用于request.body。

我的问题是两者之间有什么不同。什么是首选,什么是There should be one-- and preferably only one --obvious way to do it.

时DRF提供另一种做同样事情的方式的原因

更新:限制body始终为JSON类型的用例。从不XML /图像或传统的表单数据。每个人的利弊是什么?

2 个答案:

答案 0 :(得分:7)

您应该使用request.data。它更灵活,涵盖更多用例,并且可以根据需要多次访问。引用文档:

Aboout request.data

  

REST框架引入了一个扩展常规的Request对象   HttpRequest,并提供更灵活的请求解析。核心   Request对象的功能是request.data属性,   这与request.POST类似,但对于使用Web更有用   的API。

     

request.POST#仅处理表单数据。仅适用于'POST'方法。

     

request.data#处理任意数据。适用于'POST','PUT'和   'PATCH'方法。

关于request.body

  

原始HTTP请求正文作为字节字符串。这很有用   以不同于传统HTML形式的方式处理数据:二进制   图像,XML有效负载等。对于处理传统表单数据,请使用   HttpRequest.POST。

因此,除非您想要处理二进制图像或XML有效负载,否则永远不要使用request.body,它只是一个包含请求正文的简单字符串。始终使用request.data这将是完全解析的主体(即Python dict),这样处理起来会更方便。

答案 1 :(得分:4)

rest_framework.request.Request

  • request.body是字节,始终可用,因此使用无限制
  • request.data是一种“属性”方法,可以引发异常, 但它可以为您解析数据,更加方便

但是,世界并不完美,这是request.body获胜的情况

考虑以下示例:

如果客户发送: content-type: text/plain

并且您的REST端点不接受text/plain

您的服务器将返回415 Unsupported Media Type 如果您访问request.data

但是如果您知道json.loads(request.body)是正确的json怎么办。 因此,您想使用它,只有request.body允许。

FYI:一个描述的示例是由AWS发送到HTTP端点的AWS SNS通知消息。 AWS SNS在这里充当客户端,当然,这种情况是其SNS中的错误。


request.body的另一个好处示例是您拥有自己的自定义解析并且使用自己的MIME格式。