这是我参与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"]