解析器
一、Django中request.POST和request.body
- 请求头要求:只有当请求头中的Content-Type= application/x-www-form-urlencoded时,requst.POST中才有值(才去request.body中解析数据)。
传输数据的格式要求:name=alex&age=12&gender=boy,不是json格式
Note
只有同时满足上述两个条件时,post过来的内容才能正确的解析出来, form表单提交的是否默认的符合要求
二、rest_framework中的解析器,对请求体数据进行解析
不用解析器的情况下,获取post过来的数据:
data = '12345' data_dic = request._request.GET.get('data')
使用框架提供的解析器,解析并获取post过来的内容
Note
1.JSONParser表示只能处理Content-Type: application/json格式的,其他类型的不支持,这种数据格式在api通信中最为常用
允许用户发送json格式数据: a. content-type: application/jsonb. {'name': 'alex', 'age': 12}
2.FormParser表示只能处理Content-Type:x-www-form-urlencoded格式的数据
这是一个列表,可以写多个,这样系统可以处理多种格式数据
- 解析的流程:
- 获取用户请求
- 获取用户的请求体
- 根据用户请求头和parser_classes = [JsonParser, FormParser]中的支持请求的格式进行对比
- 匹配到适合的格式后对请求体中的数据进行解析
- request.data获取解析后的数据
解析器的局部配置
from rest_framework.parsers import JsonParser, FormParser class ParserView(APIView): parser_classes = [JsonParser, FormParser] def post(self, request, *args, **kwargs): data_dict = request.data # 通过.data来获取解析过来的数据内容 return Response("解析数据成功")
- 解析器的全局配置
视图设置
class ParserView(APIView): parser_classes = [JsonParser, FormParser] def post(self, request, *args, **kwargs): data_dict = request.data # 通过.data来获取解析过来的数据内容 return Response("解析数据成功")
settings.py文件配置
REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser'] # 解析器的全局配置 }
三、解析器源码流程&本质
- 本质:
- 请求头(类型):FileUploadParser、MultiPartParser、FormParser、JSONParser、BaseParser
- status_code:状态码
- 请求方法:POST、GET、PUT、PATCH、DELETE、OPTIONS......
- 源码流程:
- dispatch方法对request进行封装
- 解析器进行解析