一、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' ],
注:如果一个视图类在有全局配置下,还进行了局部配置,优先走自己的局部配置