7.解析器
- 依靠Content-Type对用户的请求体中的数据进行解析。
7.1django中的解析器
前戏:django中的request.POST/request.body
request.POST中有值的条件:
- 如果请求头中的:Content-Type:application/x-www-form-urlencoded。request.POST才有值。(去request.body中解析)
数据格式必须要求: name=mei&age=20&gender=女
如:
1.form表单提交
2.ajax提交数据是字典 默认会转换成 name=mei&age=20&gender=女 的格式
7.2rest_framework中解析器
from rest_framework.parsers import JSONParser,FormParser
class ParseView(APIView):
##"能解析Content-Type:
# application/json格式和application/x-www-form-urlencodeed"
parser_classes = [JSONParser,FormParser]
def post(self,request,*args,**kwargs):
"""
允许用户发送JSON格式数据:
格式1:Content-Type : application/json
格式2:{"name":"aaa",age:"bbb"}
:param request:
:param args:
:param kwargs:
:return:
"""
#1.获取用户请求头:
#2.获取用户请求体
#3.根据用户请求头和parser_classes=[JSONParser,FormParser]中支持的请求头进行比较
#4JSONParser对象去请求体
#5.request.data触发解析
print(request.data)
print(type(request.data))#
return HttpResponse("ParaserView")
- 如果要做上传操作
from rest_framework.parsers import FileUploadParser
在某个视图类添加:
class ParseView(APIView):
parser_classes = [FileUploadParser,]
def get(self,request,*args,**kwargs):
request.FILES
def post(self,request,*args,**kwargs):
...
7.3全局配置解析器
- 使用解析器,可在全局配置,个别视图需要上传文件可以用局部解析器配置:parser_classes = [FileUploadParser,]
settings.py
REST_FRAMEWORK = [
"DEFAULT_PARSER_CLASSES":[
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
...
]
]
- 源码流程 & 本质:
- 本质:
- 请求头
- 状态码
- 请求方法
- 源码流程
- dispatch
- request.data
- 本质: