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配置
默认三种都有。