drf框架中的解析组件

02-03 解析组件

1.解析组件的使用

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

# 局部配置:views.py
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser

class BookAPIView(APIView):
    """
    JSONParser: json数据
    FormParser: urlencoded
    MultiPartParser: form-data
	"""
    # 解析组件的局部配置
    parser_classes = [JSONParser, FormParser, MultiPartParser]

在项目的配置文件的drf配置中通过DEFAULT_PARSER_CLASSES对该视图的数据包解析做配置:

# 全局配置:settings.py
REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ],
}

2.源码分析

数据解析

# APIView的dispatch方法核心源码
def dispatch(self, request, *args, **kwargs):
    self.args = args
    self.kwargs = kwargs
    # 内部不仅对request进行了二次封装,还提供了数据解析
    request = self.initialize_request(request, *args, **kwargs)
    
def initialize_request(self, request, *args, **kwargs):
    # 提供要解析的数据
    parser_context = self.get_parser_context(request)
    
    return Request(
        request,
        # 提供解析的类对象(内部从配置中找解析类)
        parsers=self.get_parsers(),
        authenticators=self.get_authenticators(),
        negotiator=self.get_content_negotiator(),
        parser_context=parser_context
    )

# 从配置中找解析类 get_parsers():
def get_parsers(self):
	# 先从自定义类中找parser_classes属性,没找到再去APIView中找,也就是从用户settings中找,再从api settings中找
    return [parser() for parser in self.parser_classes]

3.总结:

解析模块的查找循序为:

  • 自定义类本身的parser_classes属性
  • 项目settings中的DEFAULT_PARSER_CLASSES配置
  • drf settings中的DEFAULT_PARSER_CLASSES配置

默认三种都有。

posted @ 2019-11-19 21:55  17vv  阅读(232)  评论(1编辑  收藏  举报