zoukankan      html  css  js  c++  java
  • 08 解析模块

    解析模块

    为什么要配置解析模块

    1)drf给我们提供了多种解析数据包方式的解析类
    2)我们可以通过配置,来控制前台提交的哪些格式的数据后台在解析,哪些数据不解析
    3)全局配置就是针对每一个视图类,局部配置就是针对指定的视图类,让它们可以按照配置规则选择性解析数据
    

    源码入口

    # APIView类的dispatch方法中
    request = self.initialize_request(request, *args, **kwargs)  # 点进去
    
    # 获取解析类
    parsers=self.get_parsers(),  # 点进去
    
    # 去类属性(局部配置) 或 配置文件(全局配置) 拿 parser_classes
    return [parser() for parser in self.parser_classes]
    

    自定义全局配置:settings.py

    REST_FRAMEWORK = {
        # 全局解析配置
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',  # 解析json数据包
            'rest_framework.parsers.FormParser',  # 解析urlencoded数据包
            'rest_framework.parsers.MultiPartParser'  # 解析from-data数据包
        ],
    }
    

    自定义局部配置:应用views.py的具体视图类

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
    class Book(APIView):
        # 局部解析配置
        parser_classes = [FormParser]  # 只解析json数据包
        def get(self, request, *args, **kwargs):
            ...
        def post(self, request, *args, **kwargs):
            # url拼接参数 : 只有一种传参方式,参数都在query_params
            print(request.query_params)  # <QueryDict: {'pk': ['1']}>
            # 数据包参数:有三种传参方式,
            # multipart/form-data | application/x-www-form-urlencoded | application/json
            print(request.data)  # <QueryDict: {'title': ['ha'], 'price': ['3.33']}>
            return Response('post ok')
    

    补充:

    # 禁用 json 方法传输数据包时用json传输数据则报一下错误
    {
        "detail": "Unsupported media type "application/json" in request."
    }
    # 禁用 urlencoded 方法传输数据包时用urlencoded传输数据则报一下错误
    {
        "detail": "Unsupported media type "application/x-www-form-urlencoded" in request."
    }
    # 禁用 form-data 方法传输数据包时用form-data传输数据则报一下错误
    {
        "detail": "Unsupported media type "multipart/form-data; boundary=--------------------------159319842159734003915314" in request."
    }
    

  • 相关阅读:
    在centos7上使用packstack安装openstack
    解决 React-Native: Android project not found. Maybe run react-native android first?
    javascript_11-函数面试题
    javascript_10-函数
    前端面试记录NO.1
    javascript_09-数组
    javascript_08-while 和 do while
    javascript_07-break 和 continue
    javascript_05-操作符
    javascript_06-控制流程
  • 原文地址:https://www.cnblogs.com/LYPZX/p/14068420.html
Copyright © 2011-2022 走看看