首页 > 其他分享 >全局异常处理封装、封装Response

全局异常处理封装、封装Response

时间:2023-02-27 20:46:33浏览次数:26  
标签:code 封装 异常 msg 全局 data Response

1 前后端分离的rbac项目演示

# 后台:https://gitee.com/liuqingzheng/rbac_manager
# 前端:https://gitee.com/liuqingzheng/vue_admin

2 全局异常处理封装

# 前端 要接受的格式,要统一,无论后端是否出错

# 三大认证,视图类的方法中只要出了异常,就会执行一个函数,但是这个函数只能处理drf的异常---》我们需要自己写一个函数,既能处理drf异常,又能处理django异常,这样统一返回格式,前端看到格式都统一了


# 使用步骤
	-第一步:在utils中新建 common_exceptions.py
    -第二步:写个函数
    	-看项目代码
     
    -第三步:配置配置文件,以后只要出了异常,都会走咱们的函数
    	REST_FRAMEWORK = {
            'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
        }
    -第四步:勇敢大胆写代码,即便报错,程序不会蹦,并且会记录日志,并且处理成统一格式    
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from utils.common_logger import logger

# 只要走到这个函数中,一定是出了异常,所以要记录日志
def exception_handler(exc,context):
    # 1 记录日志:哪个ip地址,用户id是多少,访问哪个路径,执行哪个视图函数,出了什么错
    request = context.get('request')
    view = context.get('view')
    ip = request.META.get('REMOTE_ADDR')
    user_id = request.user.pk
    path = reqeust.get_full_path()
    response = drf_exception_handler(exc, context)
    if response:
        logger.warning('drf出了异常,异常是:%s' % str(exc))
        # drf的异常已经处理了---》直接取detail会有点小小的问题,碰到在解决
        res = Response({'code': 999, 'msg': response.data.get('detail', '服务器异常,请联系系统管理员')})
    else:
        # django的异常,咱们要处理
        logger.error('用户【%s】,ip地址为【%s】,访问地址为【%s】,执行视图函数为【%s】,出错是【%s】' % (user_id, ip, path, str(view), str(exc)))
        res = Response({'code': 888, 'msg': '服务器异常,请联系系统管理员'})
        return res

3 封装Response

# 本身drf有Response,但咱们公司规定,前端收到的格式都是固定的
	-{code:100, msg:提示, data:{}/[]}
    -{code:100, msg:提示, token:asdfasd,user:lqz}
    
# 对Response进行封装,封装后,code,msg可以不传,不传就用默认的

# 使用步骤
	第一步:在utils下新建common_response.py
    第二步:封装APIRespon
    第三步:导入使用,视图函数的方法,返回时,都使用咱们自己的
class APIResponse(Response):
    def __init__(self, code=100, msg='success', status=None, headers=None, **kwargs):
        data = {'code': code, 'msg': msg}
        if kwargs: # 有值,说明传了 除了code msg status headers以外的,咱们都要返回给前端放在这个data中
            data.updata(kwargs)
        super().__init__(data=data, status=status, headers=headers)    
        # 不要return,你可以这样做  self.data=data  self.status=status

标签:code,封装,异常,msg,全局,data,Response
From: https://www.cnblogs.com/DragonY/p/17161805.html

相关文章