Django:RestFramework之-------解析器

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))#<class 'dict'>
        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
原文地址:https://www.cnblogs.com/xujunkai/p/11849886.html