• APIView请求生命周期


    今日总结

    """
    1、APIView请求生命周期
    APIView的as_view(局部禁用csrf) => 走父级的as_view调用dispatch分发请求 => APIView自己重写了dispatch,使用自己完成分发 => 分发前完成request二次封装、数据解析 => 三大认证 => 请求的实际响应(自己的视图类的处理分发) => 出现了异常,就会交给异常模块处理异常 => 响应模块完成响应、渲染模块可以json或浏览器两种方式渲染
    
    2、请求模块:
    	request._request 被 request完全兼容
    	request.query_params | request.data
    	
    3、解析模块:
    	局部配置:parser_classes = [JSONParser, FormParser, MultiPartParser]
    	全局配置:
    		'DEFAULT_PARSER_CLASSES': [
                'rest_framework.parsers.JSONParser',
                'rest_framework.parsers.FormParser',
                'rest_framework.parsers.MultiPartParser'
            ],
            
    4、响应模块:
    	Respose(data=常量|列表|字典, status=网络状态码)
    	
    5、渲染模块:
    	局部配置:renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
    	全局配置:
    		'DEFAULT_RENDERER_CLASSES': [
            	'rest_framework.renderers.JSONRenderer',
            	'rest_framework.renderers.BrowsableAPIRenderer',  # 上线后尽量关闭
        	],
        	
    6、异常模块
    	settings中配置:'EXCEPTION_HANDLER': 'api.exception.exception_handler',
    	重写exception_handler方法:
    """
    
    # 一定要在settings文件中将异常模块配置自己的异常处理函数
    from rest_framework.views import exception_handler as drf_exception_handler
    from rest_framework.response import Response
    
    # 先交个drf处理客户端异常,如果结果response为None代表服务器异常,自己处理
    # 最终一定要在日志文件中记录异常现象
    def exception_handler(exc, context):
        response = drf_exception_handler(exc, context)
        detail = '%s - %s - %s' % (context.get('view'), context.get('request').method, exc)
        if not response:  # 服务端错误
            response =  Response({'detail': detail})
        else:
            response.data = {'detail': detail}
    
        # 核心:要将response.data.get('detail')信息记录到日志文件
        # logger.waring(response.data.get('detail'))
    
        return response
    
  • 相关阅读:
    Linux命令:sed -i 解析、sed是什么、工作原理、基本语法使用、数字和正则定址、基本子命令以及最常用子命令 s 的用法
    【转】putty里面的连接key文件(ppk文件)转换为xshell里面使用的key文件
    【转】Go 中如何优雅关闭子进程?
    [转]golang 获取本机真实IP
    【转】prometheus数据写入TDengine
    怎么查看redhat的版本
    【转】YML是什么
    [转]为什么要进行URL编码
    [转]Ubuntu 上 Yarn 安装
    【转】docker -v 和Dockerfile 中VOLUME 区别
  • 原文地址:https://www.cnblogs.com/jinhongquan/p/12120417.html
Copyright © 2020-2023  润新知