django request.body、request.POST、request.data

697 阅读2分钟

这是我参与2022首次更文挑战的第14天,活动详情查看2022首次更文挑战

对于初学者而言,Django中的 request.body request.POST request.data 很难去分清这三者之间的关系,今天就对这三个进行简单的探讨。

一个类似字典的对象,包含所有给定的 HTTP POST 参数,前提是请求包含表单数据。请参阅 QueryDict下面的文档。如果您需要访问请求中发布的原始或非表单数据,请 HttpRequest.body改为通过属性访问。

有可能一个请求可以通过带有空POST 字典的 POST 进入——例如,如果通过 POST HTTP 方法请求一个表单但不包含表单数据。因此,您不应该使用 POST 方法来检查使用情况;而是使用(参见)。if request.POST``if request.method == "POST"HttpRequest.method

request.POST

官方文档中是这样记录的:

一个类似字典的对象,包含所有给定的 HTTP POST 参数,前提是请求包含表单数据。请参阅 QueryDict下面的文档。如果您需要访问请求中发布的原始或非表单数据,请 HttpRequest.body改为通过属性访问。有可能一个请求可以通过带有空POST 字典的 POST 进入——例如,如果通过 POST HTTP 方法请求一个表单但不包含表单数据。因此,您不应该使用 POST 方法来检查使用情况;而是使用(参见)。if request.POST``if request.method == "POST"HttpRequest.method

  实际上django中的request.POST只能取到Content-Type(请求头)为application/x-www-form-urlencoded(form表单默认格式)的数据,如果请求头为application/json(json格式),multipart/form-data(文件)等格式无法取到,只有在request.body里面能取到原生的数据。当发送过来的是JSON数据是,request.POST取到的数据是空的,这时只有用request.body取,再反序列化才能使用

request.body

作为字节字符串的原始 HTTP 请求正文。这对于以不同于传统 HTML 表单的方式处理数据很有用:二进制图像、XML 有效负载等。对于处理传统表单数据,使用 HttpRequest.POST.HttpRequest您还可以使用类似文件的界面读取。见 HttpRequest.read()

实际上,request.body是请求的主体,返回的是一个字符串

request.data

request.data则是请求的数据部分,返回的是一个字典对象(除此之外,与request.body是很类似的)

当我发送一个json数据时: 在这里插入图片描述

可以看出 request.body、request.data、request.POST 的结果 在这里插入图片描述

题外: url里的参数可以通过 request.GET获取,request.GET返回结果也是一个QueryDict

request.GET.get("test")
request.GET["test"]