04 drf 渲染模块
一、drf渲染模块源码分析(了解)
-
二次处理响应对象:APIView的dispatch方法 -
self.finalize_response(request, response, *args, **kwargs)
-
获取渲染类对象:进入finalize_response方法 -
self.perform_content_negotiation(request, force=True)
-
从配置文件中得到渲染类对象:进入perform_content_negotiation方法 ->
self.get_renderers()
中就一句话,但是很重要:return [renderer() for renderer in self.renderer_classes]
-
self.renderer_classes
是APIView类的类属性,他的值等于renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
,这个api_settings
是APISettings类
的对象。 -
因此就等于 APISettings类中的
DEFAULT_RENDERER_CLASSES
-
'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ],
-
这个列表中的参数是两个类。因此结合上面内容,就是两个实例化对象。两种不同的渲染方式,一种是页面渲染,一种是json渲染
-
二、自定义配置drf渲染模块
通过上面的源码分许我们发现真正得到渲染类对象的是self.renderer_classes
,那我们只要重写这个类属性就可以控制drf使用的渲染模块。我们把这个叫做局部配置
查看drf的settings类
很容易看到注释,drf也给我们提供了另外一种使用配置文件来进行配置的方式。在django运行启动时,加载配置文件就会反射找到相应的配置项,来进行drf的配置。我们把这个叫做全局配置
下面演示配置demo:
-
局部配置
# 视图层 from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer # CBV接口 class Test(APIView): # 渲染模块的局部配置 # 局部禁用就是配置空list:[] renderer_classes = [JSONRenderer, BrowsableAPIRenderer] def get(self,request,*args,**kwargs): ... def post(self,request,*args,**kwargs): ...
-
全局配置
# drf的配置 REST_FRAMEWORK = { # 渲染模块的全局配置:开发一般只配置json 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', ], }
注:如果一个视图类在有全局配置下,还进行了局部配置,优先走自己的局部配置