DRF:源码剖析 - 解析器组件
简介
解析器顾名思义就是对请求体进行解析。为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数据格式,比如xml,所以需要解析这类数据格式就需要用到解析器(也可以将请求体拿到,然后利用其他模块进行解析)。
基本使用
解析器是基于APIView,该类中的dispatch()方法中,对request做了操作,从请求头中,解析出数据,放入了request.data 中
1、json解析器
# views.py
以登录为例,发送post请求
from rest_framework.views import APIView from rest_framework.parsers import FormParser, JSONParser class LoginView(APIView): parser_classes = [FormParser, JSONParser] #在视图函数中配置解析器,一个视图函数可以配置多个 def get(self, request): return render(request, 'login.html') def post(self, request): ret = request.data #利用APIView中解析器,可以解析,浏览器发送的json数据,存储在request.data中
print(ret) #{'name': 'chen', 'age': '22'} 接收到的数据仍然是 json数据 return HttpResponse("Ok")
以 postman 工具模仿浏览器,发送post请求,发送json数据,查看返回的结果:
(1)发送请求
(2)后台结果,
仍然是接受的 json 数据,只不过解析之后,放入到了 request.data 中
2、form 解析器
同样以登录为例,视图函数同 json 解析器中一样
(1)postman 发送表单数据 post请求 urlencode数据
(2)后台接收到数据
为 querydict 类型的数据
源码剖析
1、根据以上示例,梳理解析器解析数据流程
- 获取用户请求
- 获取用户请求体
- 根据用户请求头信息和parase_classes=[...],中的请求头进行比较,匹配上请求头就使用该解析器处理
- 解析器从请求体中拿数据进行处理,处理完成之后将结果返回给request.data
2、
源码分析的相关知识点
总结
1.解析器本质:
django rest framework解析本质是根据请求头中的Content-Type来实现,不同的类型使用不同的解析器,一个视图可有多个解析器。
2.使用:
#全局使用 在settings中设置 REST_FRAMEWORK = { #解析器 "DEFAULT_PARSER_CLASSES":["rest_framework.parsers.JSONParser","rest_framework.parsers.FormParser"] }
#单一视图使用 在视图函数中设置 parser_classes = [JSONParser,FormParser]