欢迎来到Cecilia陈的博客

孤独,是人一生最好的修行。

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_settingsAPISettings类的对象。

  • 因此就等于 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',
        ],
    }
    

注:如果一个视图类在有全局配置下,还进行了局部配置,优先走自己的局部配置

posted @ 2019-11-23 18:55  Cecilia陈  阅读(122)  评论(0编辑  收藏  举报