解析器就是服务端写api,对于前端用户发来的数据进行解析。解析完之后拿到自己能用数据。
本质就是对请求体中的数据进行解析。
django的解析器
post请求过来之后,django 的request.body一定有值,request.post不一定有值。如果想让request.post有值,必须转为QueryDict类型的值。
1.urls.py
2.views.py
运行:
打印结果:
3.导入文件 解析器类
解析器类 源码流程
4.
post有值 要求1 请求头要求:
5.请求头要求:如果请求头中的 Content-Type: application/x-www-form-urlencoded,request.POST中才有值(去request.body中解析数据)。
post有值 要求2 数据格式要求:
name=xiaoming&age=18&gender=男
form表单、ajax请求:默认都是以上这种请求头和数据格式!
如果ajax请求设置请求头为json类型,那么post则没值。body里有值。
原生的django解析器:post有无值的情况
解析器 前戏:django:request.POST/ request.body 1. 请求头要求: Content-Type: application/x-www-form-urlencoded PS: 如果请求头中的 Content-Type: application/x-www-form-urlencoded,request.POST中才有值(去request.body中解析数据)。 2. 数据格式要求: name=xiaoming&age=18&gender=男 如: a. form表单提交 <form method...> input... </form> b. ajax提交 $.ajax({ url:... type:POST, data:{name:xiaoming,age=18} # 内部转化 name=alex&age=18&gender=男 }) 情况一: $.ajax({ url:... type:POST, headers:{'Content-Type':"application/json"} data:{name:alex,age=18} # 内部转化 name=xiaoming&age=18&gender=男 }) # body有值;POST无 情况二: $.ajax({ url:... type:POST, headers:{'Content-Type':"application/json"} data:JSON.stringfy({name:xiaoming,age=18}) # {name:alex,age:18...} }) # body有值;POST无 # json.loads(request.body)
rest_framework 解析器,对请求体数据进行解析
1.urls.py
2.JSONParser 解析器
from rest_framework.parsers import JSONParser
允许用户发送json数据 a. content-type: application/json b. {name:"xiaoming",age:18}
views.py
post请求:发送 json数据
打印结果:自动解析,自己没有反序列化。
4.该请求头不支持。JSONParser 只支持 content-type: application/json
5.想要支持 这种请求头怎么办
FormParser:表示只能解析application/x-www-form-urlencoded头
views.py
源码:
运行:
打印结果:
请求进了的时候,什么时候调用解析器
request.data触发了解析器:解析流程
1.请求信息都在Request.data里
from rest_framework.request import Request
看源码:
2.data
3.解析
4.拿到所有解析器列表、用户请求头
5.循环解析器列表,取每一个解析器支持的请求头。根据解析器支持的请求头,返回到底应该用哪个解析器
6.选择解析器之后,则执行解析器的parse方法。
7.比如SONParser 解析器的解析方法。将请求数据解析出来。
请求流程
1.dispatch
2.
3.执行认证之前,先获取解析器。
4.列表生成器
5.全局配置
目前request 里面有 原生的request、解析器、认证的所有方法 3个东西
全局配置解析器
1.settings.py
如果某个视图仅仅文件上传,视图就需要单独设置解析器。局部配置解析器
# parser_classes = [JSONParser,FormParser,]