Django Rest 框架:request.Post 与 request.data?
Posted
技术标签:
【中文标题】Django Rest 框架:request.Post 与 request.data?【英文标题】:Django Rest frameworks: request.Post vs request.data? 【发布时间】:2015-04-17 04:58:48 【问题描述】:引用 Django 开发人员的话,Django Rest Frameworks 对 POST
有这样的说法
请求
如果你在做基于 REST 的网络服务……你应该忽略 request.POST。
— Malcom Tredinnick,Django 开发人员组
作为经验不足的 Web 开发人员,为什么不鼓励 request.POST
(标准)而不是 request.DATA
(非标准)?更灵活吗?
【问题讨论】:
【参考方案1】:文档涵盖了这一点:
request.data 返回请求正文的解析内容。这类似于标准的 request.POST 和 request.FILES 属性,除了:
它包括所有已解析的内容,包括文件和非文件输入。 支持解析除POST以外的HTTP方法的内容,即可以访问PUT和PATCH请求的内容。 支持REST框架灵活的请求解析,而不仅仅是支持表单数据。例如,您可以像处理传入的表单数据一样处理传入的 JSON 数据。
最后两个是重要的。通过使用request.data
而不是request.POST
,您将同时支持JSON 和表单编码输入(或您配置的任何一组解析器),并且您将接受PUT
和PATCH
上的请求内容请求,以及POST
。
更灵活吗?
是的。 request.data
更灵活。
【讨论】:
那些(表单编码输入)重要吗?为什么我需要 PUT 和 PATCH 的 content ? DRF 不处理吗? Django 的request.POST
only 为您提供了对带有表单编码数据的 POST 请求的支持。 如果你想处理JSON,或者如果你想发出PUT和PATCH请求,那么REST框架的request.data
就是你想要的,是的。【参考方案2】:
我认为一些用户在尝试从 vanilla Django 中的 POST 正文获取数据时会被重定向到这里(当他们不使用 Django REST 框架时)。如果您使用的是基本的 Django 端点,您可以使用 request.body
从请求正文中获取数据,只要它不是发送到服务器的表单数据(在这种情况下使用 request.POST
)。这与使用 Django REST 框架访问数据所需的 request.data
属性不同。
from json import loads
def login(request):
json = loads(request.body)
print(json['username']) # Prints the value associated with
loads(request.body)
是必需的,因为 request.body 返回一个字节字符串。 loads
会将该字节字符串转换为字典。
request.BODY
、request.data
和 request.DATA
对于 Django 的默认请求对象都是未定义的。
https://docs.djangoproject.com/en/3.1/ref/request-response/
请注意,HttpRequest 下没有 .data
属性,这与 Django REST 框架请求不同。
(这没有回答最初的问题,但可能会帮助那些最终没有使用 REST 框架的用户)
【讨论】:
我很欣赏这个答案,但你没有链接到来源。现在在文档中吗? 抱歉,我刚刚在 Django 2.2 上测试过,发现除了request.body
之外的所有属性都不起作用。刚才去找文档,他们在这里:docs.djangoproject.com/en/2.2/ref/request-response
问题仍然是这种变化是否反映在 Django Rest Framework API 中。
我很确定接受的答案仍然正确 - 因为这是关于 Django Rest Framework 的? request.data
仍然是 DRF 中的正确方式。
@AsmoSoinio 是的,你是对的,我会改变答案谢谢,对不起。以上是关于Django Rest 框架:request.Post 与 request.data?的主要内容,如果未能解决你的问题,请参考以下文章
带有 Django 2.0 的 Django REST 框架 URL
django.test.client 上的 Django rest 框架导入错误