ajax不同数据请求的类型,Django对应不同的解析
ajax中不同数据类型对应着django不同的解析格式
ajax默认的数据类型为:application/x-www-form-urlencoded; charset=UTF-8
django默认接受前端的数据格式采用实例化生成Querydict
实例,比如request.POST,和request.GET默认都会产生Querydict
的实例,Querydict
集成了字典所有的方法,但是也有一定的区别。
举个例子:
1. 我前端没有加如下代码
1 |
|
说明:
比如我前端没有加这句话,意味着我默认使用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 |
|
说明:
我前端加了这句话,意味着我的数据类型为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
来接收数据就行了,虽然都可以接收,但是还是要具体分清传过来的类型是什么样的,这样才好根据具体类型进行解码,解析等等!
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!