• 第二章、渲染模块、解析模块、响应模块、封装响应模块


    目录

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

    一 渲染模块使用

    作用:

    基本没啥卵用,无非就可以屏蔽掉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>
  • 相关阅读:
    http 各个状态返回值
    【转载】关于HttpClient 接口方法总结
    httpclient httpcore jar包及源码
    commons.httpclient-3.X.jar 和 httpclient-4.x.jar是个什么关系?
    【转载】深入浅出REST
    httpclient 用户名密码认证实例
    java发送http请求,内容为xml格式&&传统URI类请求
    RESTful Java client with Apache HttpClient / URL /Jersey client
    MySQL命令行--导入导出数据库
    为什么有时候 php 没有写闭合标签结束符?
  • 原文地址:https://www.cnblogs.com/demiao/p/11890931.html
Copyright © 2020-2023  润新知