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 和表单编码输入(或您配置的任何一组解析器),并且您将接受PUTPATCH 上的请求内容请求,以及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.BODYrequest.datarequest.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 REST框架 -1

django.test.client 上的 Django rest 框架导入错误

Django Rest 框架令牌认证

使用 django-allauth 和 django-rest 框架

Django rest框架认证测试