03 perser 解析器

功能

解析请求头与主体内容

django的请求方法对象

  • django.request.POST
  • django.request.GET

django.request.POST有值的条件:

  1. 1.请求头要求:
  2. Content-Type:application/x-www-form-urlencoded
  3. ps:如果请求头中的 Content-Type:application/x-www-form-urlencoded,request.POST中才有值(去request.body中解析数据)
  4. 2.请求体,数据格式要求:
  5. name=wangdachui&age=18&gender=男

客户端提交请求方式

  • 原始form表单提交
  • ajax提交
  1. # form表单提交
  2. <form method...> # 默认请求头application/x-www-form-urlencoded
  3. input... # 默认主体格式 name=wangdachui&age=18&gender=男
  4. </form>
  5. # ajax提交
  6. b.ajax提交
  7. $.ajax({
  8. url:...
  9. type:POST,
  10. data:{name:"wangdachui",age=18}, #内部转化name=wangdachui&age=18&gender=男
  11. })
  12. $.ajax({
  13. url:...
  14. type:POST,
  15. headers: {'Content-Type':"application/json"} # 定制了请求头,后台无法取得数据
  16. data:{name:"wangdachui",age=18} # 内部转化name=wangdachui&age=18&gender=男
  17. })
  18. $.ajax({
  19. url:...
  20. type:POST,
  21. headers: {'Content-Type':"application/json"} # 定制了请求头,后台无法取得数据
  22. dataJSON.stringfy({name:"wangdachui",age=18}) # 数据格式也不满足要求
  23. })

类型

解析器类型 功能
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=[]
  1. from rest_framework.parsers import JSONParser
  2. class ParserView(APIView):
  3. """ DRF 解析json数据"""
  4. # JSONParser: 只能解析Content-Type:application/json
  5. # FormParser: 只能解析Content-Type:application/x-www-form-urlencoded
  6. parser_classes = [JSONParser,FormParser,]
  7. def post(self, request, *args, **kwargs):
  8. """
  9. 允许用户发送json数据格式
  10. 1. 'Content-Type':"application/json"
  11. 2. {name:"wangdachui",age=18}
  12. """
  13. # 获取解析后的结果
  14. """
  15. 1.获取请求头
  16. 2.获取请求体
  17. 3.根据用户请求头和parser_classes = [JSONParser,FormParser,]中支持的请求头进行比较
  18. 4.JSONParser对象去请求体
  19. 5.request.data
  20. """
  21. print(reqeust.data)
  22. # 获取上传的文件,配置解析器FileUploadParser使用
  23. # request.file

解析器的全局配置

  1. # 解析器的全局配置
  2. REST_FRAMEWORK ={
  3. "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
  4. "DEFAULT_VERSION":'v1',
  5. "ALLONED_VERSIONS":['v1','v2'],
  6. "VERSION_PARAM":'version',
  7. # 全局配置解析器
  8. "DEFAULT_PARSER_CLASSES":[
  9. 'rest_framework.parsers.JSONParser',
  10. 'rest_framework.parsers.FormParser'
  11. ]
  12. }