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'
    ],
    

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

posted @ 2020-04-10 11:42  小芒果测开笔记  阅读(179)  评论(0编辑  收藏  举报