Django Rest框架:request.Post vs request.data?

Pur*_*ret 11 python django rest django-rest-framework

Django Rest框架有这个说POST,引用一个Django开发

要求

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

- Django开发团队的Malcom Tredinnick

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

Tom*_*tie 17

文档涵盖了这个:

request.data返回请求正文的已解析内容.这类似于标准的request.POST和request.FILES属性,除了:

  • 它包括所有已解析的内容,包括文件和非文件输入.
  • 它支持解析除POST之外的HTTP方法的内容,这意味着您可以访问PUT和PATCH请求的内容.
  • 它支持REST框架的灵活请求解析,而不仅仅支持表单数据.例如,您可以像处理传入表单数据一样处理传入的JSON数据.

最后两个是重要的.通过使用request.data整个而不是request.POST,您支持JSON和表单编码输入(或您配置的任何解析器集),并且您将接受请求内容PUTPATCH请求,以及POST.

一个人更灵活吗?

是.request.data更灵活.

  • Django 的`request.POST` *only* 支持带有表单编码数据的 POST 请求。*如果*你想处理JSON,或者*如果*你想发出PUT和PATCH请求,那么REST框架的`request.data`就是你想要的,是的。 (2认同)

Yun*_*Gun 10

我认为某些用户在尝试从普通 Django 中的 POST 正文获取数据时(当他们不使用 Django REST 框架时)会被重定向到此处。如果您使用基本的 Django 端点,则可以用来request.body从请求正文中获取数据,只要它不是发送到服务器的表单数据(在这种情况下使用request.POST)。request.data这与使用 Django REST 框架访问数据所需的属性不同。

from json import loads
def login(request):
    json = loads(request.body)
    print(json['username']) # Prints the value associated with 
Run Code Online (Sandbox Code Playgroud)

loads(request.body)是必需的,因为 request.body 返回一个字节字符串。loads将该字节字符串转换为字典。

request.BODY对于 Django 的默认请求对象, 、request.data、 和request.DATA均未定义。

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

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

(这并没有回答原来的问题,但可能会对最终没有使用 REST 框架的用户有所帮助)