zoukankan      html  css  js  c++  java
  • drf的渲染模块

    drf的渲染模块(了解)

    1. 可以在视图类中通过renderer_classes类属性对该视图的数据响应渲染做配置 - 局部配置
    2. 可以在项目的配置文件的drf配置中通过DEFAULT_RENDERER_CLASSES对该视图的数据响应渲染做配置 - 全局配置
      注:如果一个视图类在有全局配置下,还进行了局部配置,优先走自己的局部配置

    drf 必须要进行配置

    INSTALLED_APPS = [
    	...
        'rest_framework'
    ]
    

    局部配置

    直接在类中进行配置

    from rest_framework.renderers import JSONRenderer  # json格式的渲染
    from rest_framework.renderers import BrowsableAPIRenderer  # 浏览器格式的渲染
    
    
    # JSONParser: json数据
    # FormParser: urlencoded
    # MultiPartParser:form-data
    class Book(APIView):
        renderer_classes = [JSONRenderer,]### json格式的渲染
        
        def get(self, request, *args, **kwargs):
            return Response('get ok')
    

     renderer_classes = [BrowsableAPIRenderer,]###浏览器渲染
    

    renderer_classes = [BrowsableAPIRenderer,JSONRenderer]
    #俩个都有 会选择第一个
    
    renderer_classes = []#如果为空 的话就无法请求
    

    全局配置

    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            # 'rest_framework.renderers.BrowsableAPIRenderer',
        ],
        
    }
    

    开发一般只会配置JSONRenderer,防止破解

    有全局和局部都配置的情况下,优先走局部配置

    渲染模块源码分析

    1. 二次处理响应对象:APIView的dispatch方法 - self.finalize_response(request, response, *args, **kwargs)
    2. 获取渲染类对象:进入finalize_response方法 - self.perform_content_negotiation(request, force=True)
    3. 从配置文件中得到渲染类对象:perform_content_negotiation -> self.get_renderers() -> [renderer() for renderer in self.renderer_classes]

    核心:可以全局和局部配置视图类支持的结果渲染:默认可以json和页面渲染,学习该模块的目的是开发可以全局只配置json方式渲染

    入口:dispatch()方法

      #     二次处理,渲染模块
    self.response = self.finalize_response(request, response, *args, **kwargs)
            
    
            if isinstance(response, Response):
                if not getattr(request, 'accepted_renderer', None):
                    # 内部解析了配置的渲染类
                    neg = self.perform_content_negotiation(request, force=True)
                    # 解压赋值
                    request.accepted_renderer, request.accepted_media_type = neg
    
    
     def perform_content_negotiation(self, request, force=False):
            """
            Determine which renderer and media type to use render the response.
            """
            # 获取渲染的方式
            renderers = self.get_renderers()
            conneg = self.get_content_negotiator()
    
            try:
                return conneg.select_renderer(request, renderers, self.format_kwarg)
            except Exception:
                if force:
                    # 获取第一个渲染方式
                    return (renderers[0], renderers[0].media_type)
                raise
    
       def get_renderers(self):
            """
            Instantiates and returns the list of renderers that this view can use.
            """
            # 找rederers_classes方法
            return [renderer() for renderer in self.renderer_classes]
    
    
    class APIView(View):
    
        # The following policies may be set at either globally, or per-view.
        renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
    

    首先找自己的配置,自己没有找局部配置,然后找全局配置,最后找django配置的

  • 相关阅读:
    作业十一
    作业十
    作业九
    作业八
    作业七
    作业六
    作业五
    作业四
    eclipse+maven+web服务,实现对hdfs的目录浏览展示
    Eclipse+hadoop伪态式分布+API
  • 原文地址:https://www.cnblogs.com/SkyOceanchen/p/11895471.html
Copyright © 2011-2022 走看看