框架之解析器

解析器

一、Django中request.POST和request.body

  • 请求头要求:只有当请求头中的Content-Type= application/x-www-form-urlencoded时,requst.POST中才有值(才去request.body中解析数据)。
  • 传输数据的格式要求:name=alex&age=12&gender=boy,不是json格式

    Note
    只有同时满足上述两个条件时,post过来的内容才能正确的解析出来, form表单提交的是否默认的符合要求

二、rest_framework中的解析器,对请求体数据进行解析

  1. 不用解析器的情况下,获取post过来的数据:

     data = '12345'
     data_dic = request._request.GET.get('data')
  2. 使用框架提供的解析器,解析并获取post过来的内容

    Note
    1.JSONParser表示只能处理Content-Type: application/json格式的,其他类型的不支持,这种数据格式在api通信中最为常用
    允许用户发送json格式数据: a. content-type: application/json

    b. {'name': 'alex', 'age': 12}
    2.FormParser表示只能处理Content-Type:x-www-form-urlencoded格式的数据
    这是一个列表,可以写多个,这样系统可以处理多种格式数据

  • 解析的流程:
    • 获取用户请求
    • 获取用户的请求体
    • 根据用户请求头和parser_classes = [JsonParser, FormParser]中的支持请求的格式进行对比
    • 匹配到适合的格式后对请求体中的数据进行解析
    • request.data获取解析后的数据
  • 解析器的局部配置

      from rest_framework.parsers import JsonParser, FormParser
      class ParserView(APIView):
          parser_classes = [JsonParser, FormParser]
          def post(self, request, *args, **kwargs):
              data_dict = request.data
              # 通过.data来获取解析过来的数据内容
              return Response("解析数据成功")
  • 解析器的全局配置
    • 视图设置

        class ParserView(APIView):
            parser_classes = [JsonParser, FormParser]
            def post(self, request, *args, **kwargs):
                data_dict = request.data
                # 通过.data来获取解析过来的数据内容
                return Response("解析数据成功")
    • settings.py文件配置

        REST_FRAMEWORK = {
            'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser']
            # 解析器的全局配置
        }

三、解析器源码流程&本质

  1. 本质:
    • 请求头(类型):FileUploadParser、MultiPartParser、FormParser、JSONParser、BaseParser
    • status_code:状态码
    • 请求方法:POST、GET、PUT、PATCH、DELETE、OPTIONS......
  2. 源码流程:
    • dispatch方法对request进行封装
    • 解析器进行解析

你可能感兴趣的:(框架之解析器)