Django Rest 框架:请求。帖子与request.data?

Django Rest frameworks: request.Post vs request.data?

提问人:AncientSwordRage 提问时间:2/17/2015 最后编辑:CommunityAncientSwordRage 更新时间:1/25/2021 访问量:11589

问:

Django Rest Frameworks 引用了 Django 开发人员的话POST

请求

如果你正在做基于 REST 的 Web 服务......你应该忽略 request.POST。

— Malcom Tredinnick,Django 开发者组

作为经验不足的 Web 开发人员,为什么(标准)比(非标准)更不鼓励?一个更灵活吗?request.POSTrequest.DATA

python django django-rest-框架

评论


答:

33赞 Tom Christie 2/17/2015 #1

文档涵盖以下内容:

request.data 返回请求体的解析内容。这类似于标准请求。POST 和请求。FILES 属性,但以下属性除外:

  • 它包括所有解析的内容,包括文件和非文件输入。
  • 它支持解析 POST 以外的 HTTP 方法的内容,这意味着您可以访问 PUT 和 PATCH 请求的内容。
  • 它支持REST框架的灵活请求解析,而不仅仅是支持表单数据。例如,您可以采用与处理传入表单数据相同的方式处理传入的 JSON 数据。

最后两个是重要的。通过使用 through 而不是 ,您将同时支持 JSON 和表单编码的输入(或您配置的任何一组解析器),并且您将接受 和 请求以及 for 的请求内容。request.datarequest.POSTPUTPATCHPOST

一个更灵活吗?

是的。 更灵活。request.data

评论

0赞 AncientSwordRage 2/17/2015
这些(表单编码输入)重要吗?为什么我需要 PUT 和 PATCH 的内容?DRF 不处理吗?
4赞 Tom Christie 2/17/2015
Django 支持使用表单编码数据的 POST 请求。如果你想处理JSON,或者如果你想发出PUT和PATCH请求,那么REST框架就是你想要的,是的。request.POSTrequest.data
10赞 ICW 9/29/2019 #2

我认为一些用户在尝试从原版 Django 的 POST 正文中获取数据时(当他们不使用 Django REST 框架时)被重定向到这里。如果你使用的是基本的 Django 端点,你用它来从请求正文中获取数据,只要它不是发送到服务器的表单数据(在这种情况下,请使用 )。这与使用 Django REST 框架访问数据所需的属性不同。request.bodyrequest.POSTrequest.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、 和 对于 Django 的默认请求对象都是未定义的。request.datarequest.DATA

https://docs.djangoproject.com/en/3.1/ref/request-response/

请注意,HttpRequest 下没有与 Django REST 框架请求不同的属性。.data

(这并不能回答最初的问题,但可能会帮助那些最终没有使用REST框架的用户)

评论

1赞 AncientSwordRage 10/3/2019
我很欣赏这个答案,但你没有链接到来源。现在在文档中吗?
0赞 ICW 10/3/2019
对不起,我刚刚在 Django 2.2 上测试了它,发现除了工作之外,其他属性都不起作用。刚才去找了文档,它们在这里:docs.djangoproject.com/en/2.2/ref/request-responserequest.body
1赞 AncientSwordRage 10/3/2019
问题仍然是这种变化是否反映在 Django Rest 框架 API 中。
0赞 Asmo Soinio 1/25/2021
我很确定公认的答案仍然是正确的 - 因为这是关于 Django Rest 框架的? 在DRF中仍然是正确的方法。request.data
1赞 ICW 1/25/2021
@AsmoSoinio 是的,你是对的,我会改变答案,谢谢,对不起。