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

    一、drf解析模块源码分析(了解)

    drf解析模块服务的对象是数据包数据

    • APIView的dispatch方法:self.initialize_request(request, *args, **kwargs) 二次封装request方法的内部还提供了数据解析

    • self.get_parser_context(request) 方法提供要解析的数据self.get_parsers() 方法提供解析的类对象(内部从配置中找解析类)

    • self.get_parsers()方法中就一句话:return [parser() for parser in self.parser_classes]self.parser_classes也是APIView类中的类属性。和渲染模块获取类对象的方法一致。都是通过设置类属性来引入配置文件中的配置项

    • parser_classes = api_settings.DEFAULT_PARSER_CLASSES这里的api_settings 也是APISettings类对象。

    • APISettings类在settings.py中,通过settings.py的相应配置来拿到相应的值,该值就是相应的解析类

      • 'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
            'rest_framework.parsers.FormParser',
            'rest_framework.parsers.MultiPartParser'
        ],
        
      • 配置项中的三个参数,就是相应的解析类

    二、自定义配置drf解析模块

    '''
    核心:请求的数据包格式会有三种(json、urlencoded、form-data),drf默认支持三种数据的解析,可以全局或局部配置视图类具体支持的解析方式
    '''
    

    我们只要重写这个类属性就可以控制drf使用的渲染模块。我们把这个叫做局部配置

    查看drf的settings类很容易看到注释,drf也给我们提供了另外一种使用配置文件来进行配置的方式。在django运行启动时,加载配置文件就会反射找到相应的配置项,来进行drf的配置。我们把这个叫做全局配置

    下面演示配置demo:

    • 局部配置:可以在视图类中通过parser_classes类属性对该视图的数据包解析做配置

      # 视图层
      from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
      # CBV接口
      class Test(APIView):
          # 解析模块的局部配置,配置哪个类就相应支持哪个解析方式
          parser_classes = [JSONParser, MultiPartParser, FormParser]
          
          def get(self,request,*args,**kwargs):
              ...
              
          def post(self,request,*args,**kwargs):
              ...
      
    • 全局配置:可以在项目的配置文件的drf配置中通过DEFAULT_PARSER_CLASSES对该视图的数据包解析做配置

      # 解析模块的全局配置
      'DEFAULT_PARSER_CLASSES': [
          # 可以只配置需要的解析类
          'rest_framework.parsers.JSONParser',
          'rest_framework.parsers.FormParser',
          'rest_framework.parsers.MultiPartParser'
      ],
      

    注:如果一个视图类在有全局配置下,还进行了局部配置,优先走自己的局部配置

  • 相关阅读:
    【hdu4057】 恨7不成妻
    【hdu3709】 Balanced Number
    【hdu3555】 Bomb
    【hdu2809】 不要62
    【bzoj3992】 SDOI2015—序列统计
    【uoj125】 NOI2013—书法家
    【bzoj1833】 ZJOI2010—count 数字计数
    【bzoj1026】 SCOI2009—windy数
    【bzoj2780】 Sevenk Love Oimaster
    【bzoj3930】 CQOI2015—选数
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11893220.html
Copyright © 2011-2022 走看看