zoukankan      html  css  js  c++  java
  • 第二章、渲染模块、解析模块、响应模块、封装响应模块

    目录

    渲染模块、解析模块、响应模块、封装响应模块

    一 渲染模块使用

    作用:

    基本没啥卵用,无非就可以屏蔽掉django给浏览器返回规整的模板,又或者那drf返回模板。那不用drf得了呗。

    局部配置

    from rest_framework.views import APIView
    from rest_framework.response import Response
    

    from rest_framework.renderers import JSONRenderer
    from rest_framework.renderers import BrowsableAPIRenderer
    class UserAPIView(APIView):
    # 局部配置:只有该视图类起作用
    renderer_classes = [JSONRenderer] # 只提供JSON数据渲染
    pass

    全局配置

    # drf配置
    REST_FRAMEWORK = {
        # 响应的渲染模块
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',
        ],
    }

    二 请求数据解析模块:

    作用:

    规定可以解析前台传过来的数据类型,都最后都统一解析到request.data里。

    默认支持解析前台传来json、form-data、urlencoding这三种类型

    源码浅析

    # 入口:APIView类的dispatch函数
    request = self.initialize_request(request, *args, **kwargs)
    ->
    parsers=self.get_parsers()
    ->
    self.parser_classes
    ->
    APISetting:DEFAULT_PARSER_CLASSES

    局部配置

    from rest_framework.views import APIView
    from rest_framework.response import Response
    

    from rest_framework.parsers import JSONParser
    from rest_framework.parsers import FormParser
    from rest_framework.parsers import MultiPartParser
    class UserAPIView(APIView):
    # 局部配置:只有该视图类起作用
    parser_classes = [JSONParser] # 只提供JSON解析
    pass

    全局配置

    # drf配置
    REST_FRAMEWORK = {
        # 响应的渲染模块
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',
        ],
        # 请求数据解析模块
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',  # 'application/json'
            'rest_framework.parsers.FormParser',  # 'application/x-www-form-urlencoded'
            'rest_framework.parsers.MultiPartParser'  # multipart/form-data
        ],
    }

    请求数据解析位置

    # 请求的数据包:均解析到 request.data 中
    # 请求的?文件参数:均解析到 request.query_params 中

    三 响应模块

    # 响应可以设置响应数据、响应网络状态码、响应头、响应数据类型等
    data = {
        'status': 0,
        'msg': 'get ok',
        'results': [],
        'token': '123.12321.231'
    }
    from rest_framework import status
    class ..
        def ..
            return Response(
                data=data,
                status=status.HTTP_200_OK,
                headers={'Token': '123as.masd21.asd213sd'},# 规定响应头里面的内容
                content_type='application/json'  # 强制让所有的请求返回时候是 json格式了,最好不要这么做,如果返回的格式是 text/html 就会出问题。
          )

    四 封装响应模块

    views.py

    from rest_framework.response import Response
    from rest_framework.views import APIView
    from my_utils.response import APIResponse
    class UserView(APIView):
        # 局部配置:只有该视图类起作用
        # 也就是只能返回Json的格式,不会对浏览器做额外处理
        # renderer_classes = [JSONRenderer]
        def get(self,request,*args,**kwargs):
            """
            # 封装前
            Response({
                'status': 0,
                'msg': 'ok',
                'results': [],
                'token': ''
            }, headers={}, status=200, content_type="")
    
        # 封装后
        APIResponse(0, 'ok', results, status, headers, content_type)
        """</span>
        <span class="hljs-keyword">return</span> APIResponse(<span class="hljs-string">'1'</span>,<span class="hljs-string">'ok'</span>,[<span class="hljs-string">'123123'</span>,<span class="hljs-string">'123'</span>],token=<span class="hljs-string">'123,123,123'</span>)</code></pre>
    

    my_utils/response.py

    from rest_framework.response import Response
    # from rest_framework import status
    """
    # 封装前
    Response({
        'status': 0,
        'msg': 'ok',
        'results': [],
        'token': ''
    }, headers={}, status=200, content_type="")
    

    封装后

    APIResponse(0, 'ok', results, status, headers, content_type)
    """
    class APIResponse(Response):
    def init(self,data_status,data_msg,results='',status=None,headers=None,content_type=None,**kwargs):
    data ={
    'status':data_status,
    'msg':data_msg
    }
    if results:
    data['results'] = results

        data.update(kwargs)
        super().__init__(data=data,status=status,headers=headers,content_type=content_type)</code></pre>
  • 相关阅读:
    灾难 BZOJ 2815
    消耗战 BZOJ 2286
    征途 BZOJ 4518
    纸箱堆叠 BZOJ 2253
    Gate Of Babylon BZOJ 1272
    std::string::npos mean
    [转]整理索引碎片,提升SQL Server速度
    笔记本win7制作wifi
    关闭linux下的使用的端口
    linux多线程
  • 原文地址:https://www.cnblogs.com/demiao/p/11890931.html
Copyright © 2011-2022 走看看