ajax不同数据请求的类型,Django对应不同的解析

ajax中不同数据类型对应着django不同的解析格式

ajax默认的数据类型为:application/x-www-form-urlencoded; charset=UTF-8

django默认接受前端的数据格式采用实例化生成Querydict实例,比如request.POST,和request.GET默认都会产生Querydict的实例,Querydict集成了字典所有的方法,但是也有一定的区别。

举个例子:


1. 我前端没有加如下代码
1
2
3
beforeSend:function(req){
req.setRequestHeader('Content-Type','application/json');
},

说明:

比如我前端没有加这句话,意味着我默认使用application/x-www-form-urlencoded,这样我后端通过request.POST和request.GET进行接受,接受到的类型被转为Querydict实例。但是一般的话字典的键是不能重复的,因此如果遇到前端传来多个重复的键,那么Querydict实例会将这些键的值组合为一个列表。因此值的基本单位为列表,而不是以往的单个数值了。

所以在解析的时候要注意:

① 通常要利用data.get(‘key’)[0]来获取第一个值

② 如果采用request.body来接受application/x-www-form-urlencoded的类型的数据的话,它会对其进行拆包成为一种二进制流的形式,形如b'id=2'


2. 我前端加指明数据类型,以及将数据转为json对象
1
2
3
4
5
6
let data = JSON.stringify({'id':id_dom.text()});

...
beforeSend:function(req){
req.setRequestHeader('Content-Type','application/json');
},

说明:

我前端加了这句话,意味着我的数据类型为application/json格式,因此我django后端解析的时候就不能使用request.POST了,因为它获取不到,可以使用request.body来获取二进制的json格式的字符串。,形如:b'{"id":"2"}毕竟数据都是以二进制流的方式在网络中传输。


基于django-restful-framework的数据解析方法

drf中提供了一种适用于多种数据格式的中间件用来接收数据,request.data,他可以接收基本application/x-www-form-urlencoded类型的数据,采用Querydict实例化,或者接收application/json的数据格式,不过跟request.body结果存在着类型的差别,request.data获取到的json数据是已经通过uft-8解码好并转为python内置的字典对象了串,形如:{‘id’:’2’}而request.body是还未编码的bytes类型数据。

注:

如果基于application/json这种数据格式传输,要保证键不能相同,不然最终只会取最后一个键的值。这就相当于python字典的update方法了。


总结:

如果前端传过来的是POST,为了方便起见,前端通常转换成json对象,以application/json数据格式进行传输,drf接口开发采用request.data
来接收数据就行了,虽然都可以接收,但是还是要具体分清传过来的类型是什么样的,这样才好根据具体类型进行解码,解析等等!