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.
更新:限制body始终为JSON类型的用例。从不XML /图像或传统的表单数据。每个人的利弊是什么?
答案 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'方法。
原始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格式。