03 perser 解析器
功能
解析请求头与主体内容
django的请求方法对象
- django.request.POST
- django.request.GET
django.request.POST
有值的条件:
1.请求头要求:
Content-Type:application/x-www-form-urlencoded
ps:如果请求头中的 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-urlencoded
input... # 默认主体格式 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 JSONParser
class ParserView(APIView):
""" DRF 解析json数据"""
# JSONParser: 只能解析Content-Type:application/json
# FormParser: 只能解析Content-Type:application/x-www-form-urlencoded
parser_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'
]
}