解析模块

为什么要配置解析模块

"""
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]

"""调用解析的入口"""
# 1 在调用request.data时,才进行解析,由此入手
    @property
    def data(self):
        if not _hasattr(self, '_full_data'):
            self._load_data_and_files()
        return self._full_data
        
# 2 查看self._load_data_and_files()方法---->self._data, self._files = self._parse()

	def _parse(self):
    	#用户请求头里content_type的值	
    	media_type = self.content_type

        #self.parsers 就是用户配置的parser_classes = [FileUploadParser,FormParser ]
        #self里就有content_type,传入此函数
        parser = self.negotiator.select_parser(self, self.parsers)

# 3 查看self.negotiator.select_parser(self, self.parsers)
     def select_parser(self, request, parsers):
        #同过media_type和request.content_type比较,来返回解析器,然后调用解析器的解析方法
        #每个解析器都有media_type = 'multipart/form-data'属性
        for parser in parsers:
            if media_type_matches(parser.media_type, request.content_type):
                return parser
        return None
    
# 4 最终调用parser的解析方法来解析parsed = parser.parse(stream, media_type, self.parser_context)

全局配置:项目settings.py文件

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

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

from rest_framework.parsers import JSONParser
class Book(APIView):
    # 局部解析类配置,只要json类型的数据包才能被解析
    parser_classes = [JSONParser]
    pass
posted @ 2019-11-25 22:44  yscl  阅读(198)  评论(0编辑  收藏  举报