03 perser 解析器
功能
解析请求头与主体内容
django的请求方法对象
- django.request.POST
- django.request.GET
django.request.POST有值的条件:
1.请求头要求:Content-Type:application/x-www-form-urlencodedps:如果请求头中的 Content-Type:application/x-www-form-urlencoded,request.POST中才有值(去request.body中解析数据)2.请求体,数据格式要求:name=wangdachui&age=18&gender=男
客户端提交请求方式
- 原始form表单提交
- ajax提交
# form表单提交<form method...> # 默认请求头application/x-www-form-urlencodedinput... # 默认主体格式 name=wangdachui&age=18&gender=男</form># ajax提交b.ajax提交$.ajax({url:...type:POST,data:{name:"wangdachui",age=18}, #内部转化name=wangdachui&age=18&gender=男})$.ajax({url:...type:POST,headers: {'Content-Type':"application/json"} # 定制了请求头,后台无法取得数据data:{name:"wangdachui",age=18} # 内部转化name=wangdachui&age=18&gender=男})$.ajax({url:...type:POST,headers: {'Content-Type':"application/json"} # 定制了请求头,后台无法取得数据data:JSON.stringfy({name:"wangdachui",age=18}) # 数据格式也不满足要求})
类型
| 解析器类型 | 功能 |
|---|---|
| JSONParser | 解析JSON请求内容 .media_type: application/json |
| FormParser | 解析HTML表单内容 .media_type:application/x-www-form-urlencoded |
| MultiPartParser | 分析支持文件上传的多部分HTML表单内容。.media_type:multipart/form-data |
| FileUploadParser | 分析原始文件上传内容。 |
DRF解析json
源码流程与本质:
检查请求头’Content-Type’的不同,使用不同的解析器解析
解析器使用范围
- 局部视图使用,指定使用
parser_classes=[认证类(),] - 全局视图使用,指定不使用
parser_classes=[]
from rest_framework.parsers import JSONParserclass ParserView(APIView):""" DRF 解析json数据"""# JSONParser: 只能解析Content-Type:application/json# FormParser: 只能解析Content-Type:application/x-www-form-urlencodedparser_classes = [JSONParser,FormParser,]def post(self, request, *args, **kwargs):"""允许用户发送json数据格式1. 'Content-Type':"application/json"2. {name:"wangdachui",age=18}"""# 获取解析后的结果"""1.获取请求头2.获取请求体3.根据用户请求头和parser_classes = [JSONParser,FormParser,]中支持的请求头进行比较4.JSONParser对象去请求体5.request.data"""print(reqeust.data)# 获取上传的文件,配置解析器FileUploadParser使用# request.file
解析器的全局配置
# 解析器的全局配置REST_FRAMEWORK ={"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning","DEFAULT_VERSION":'v1',"ALLONED_VERSIONS":['v1','v2'],"VERSION_PARAM":'version',# 全局配置解析器"DEFAULT_PARSER_CLASSES":['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser']}
