• 请求响应组件


    请求响应组件

    请求模块

    drf的request是对wsgi的request的二次封装, 并且完全兼容, 并且拓展了 query_params 和 data 两个属性

    这里的完全兼容是因为源码中写的情况是, 把原来的request改变成_request,drf自己封装了自己的request,检索的时候如果_request中找不到就在自己封装的里面去找,所以说完全兼容,并且还得以扩展.

    渲染模块

    需要在注册app的地方注册一下rest_framework

    可以全局和局部配置渲染方式

    只允许renderers_classes中定义的渲染方式

    # 局部
    
    from rest_framework.views improt APIView
    // 有好多渲染方式
    from rest_framework.renderers import JSONRenderer, BrowsableAPIRender, BaseRenderer
    
    class XXX(APIView):
    	# 这个位置添加局部配置
        renderers_classes = [JSONRenderer, BrowsableAPIRender,BaseRenderer]
        def xx(self, request, *args, **kwargs):
    		...
    
    
    
    # 全局配置
    
    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': [
            # 配置只允许渲染json数据
            'rest_framework.renderers.JSONRenderer',  
        ], 
    }
    

    解析模块

    需要在注册app的地方注册一下rest_framework

    可以全局和局部配置允许解析的数据包

    # 局部
    
    from rest_framework.views improt APIView
    // 有好多格式的数据包,这里只列举几个
    from rest_framework.parser import JSONParser, BaseParser
    
    class XXX(APIView):
    	# 这个位置添加局部配置
        renderers_classes = [JSONParser,BaseParser]
        def xx(self, request, *args, **kwargs):
    		...
    
    # 全局配置
    
    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': [
            # 配置只允许接收json数据
            'rest_framework.parsers.JSONParser', 
        ],
    }
    

    异常模块

    需要在注册app的地方注册一下rest_framework

    自定义异常模块, 可以自定义异常返回以及把异常记录到日志中,方便在项目上线后进行一些调试,不然错都不知道在哪儿去找

    第一步: 创建一个任意名字的py文件,例如: utils.py

    第二步: 在py文件中写下面格式的函数, 函数名一定要是这样的

    from rest_framework.response import Response
    # 导入源码中的exception_handler函数,因为重名,所以定义别名
    from rest_framework.views import exception_handler as drf_exception_handler
    from rest_framework import status
    
    # 名字和源码中的一样(exception_handler)
    def exception_handler(exc, context):
        # 通过源码我们知道drf_exception_handler处理服务端报错的时候返回值是空
        response = drf_exception_handler(exc, context)
        if response is None:
            # 如果这个为空, 就说明是服务器的500错误
            # 这个错误是drf不做处理的
            # 我们把错误信息保存到日志文件中
            # data: 传递的数据
            # status:响应状态码
            response = Response(data={'status': '1', 'msg': 'error', 'exc': f'{exc}'},
                                status=status.HTTP_500_INTERNAL_SERVER_ERROR)
            return response
        response = Response(data={'status': '1', 'msg': 'error', 'exc': f'{exc}'})
        return response
    

    第三步: 因为源码中的exception_handler方法是只处理客户端的错误,对于服务端的错误是返回空, 所有我们可以对其进行重写.

    第四步: 完成了删除代码,我们可以在settings文件中配置告诉drf执行我们重写的exception_handler方法,配置如下:

    REST_FRAMEWORK = {
        # 配置异常模块为自己的异常模块
        'EXCEPTION_HANDLER': 'api.utils.exception_handler',
    }
    

    settings中的配置

    我们可以把上面的配置写在一起, 他们就是在REST_FRAMEWORK中的

    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',  # 配置只允许渲染json数据
        ],
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser', # 配置只允许接收json数据
        ],
        # 配置异常模块为自己的异常模块
        'EXCEPTION_HANDLER': 'api.utils.exception_handler',
    }
    

    响应模块

    了解Response对象产生可以传那些信息, Response对象又是如何访问这些信息的

    # Response源码的需要的参数
    def __init__(self, data=None, status=None,
                     template_name=None, headers=None,
                     exception=False, content_type=None):
    
    

    Response.data: 可以取出来传递的数据,相对的也可以设置传递的数据

    Response.status: 可以取出来状态码,也可以设置状态码

    这两个常用...

  • 相关阅读:
    【开发者笔记】MQTT python测试笔记
    【工具】代码生成器-python脚本
    【开发者笔记】进制转换
    【开发者笔记】按List中存放对象的某一字段计数的问题
    【开发者笔记】二分法查找
    【数据库学习】聚合函数的使用
    【开发者笔记】学习区块链过程中的一些理解
    【spring学习】中文乱码问题
    【开发者笔记】我也来画一个手机
    【开发者笔记】java 利用jna调用c#的dll
  • 原文地址:https://www.cnblogs.com/xiongchao0823/p/11892138.html
Copyright © 2020-2023  润新知