后台response和异常处理封装
我们自己封装的一些东西,往往放在一个utils文件夹内,以后也方便管理和导入
后台response封装
# 自己封装的Response对象
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self,code=1,msg="成功",result=None,status=None,headers=None,content_type=None,**kwargs):
dic = {
"code":code,
"msg":msg
}
if result:
dic["result"]=result
dic.update(kwargs)
super().__init__(data=dic,status=status,headers=headers,content_type=content_type)
自己封装的异常处理
# 这里用来放全局异常
# 这个方法可以从rest_framework里的settings.py里找到它的配置,然后导入就行,重写该方法
from rest_framework.views import exception_handler
from . import response # 导入自己定义的响应对象
from .logger import log #导入自己定义的日志对象
def common_exception_handler(exc, context):
# 记录以下报错信息到日志中
# context["view"]可以取到具体是哪个视图出了错
log.error("view是:%s,错误是:%s" %(context["view"].__class__.__name__,str(exc)))
# 先调用一下原来的exception_handler方法
ret = exception_handler(exc, context) # ret是一个Response对象,其内部有一个data属性,放的就是错误信息
# 这个表示如果drf处理不了的异常(交给django处理的异常),我们进行处理一下
if not ret:
# 这里面也可以放更多其他逻辑,具体对于会出现的异常进行分类处理
# 比如下面这样
# if isinstance(exc,KeyError):
return response.APIResponse(code=0,msg="error",result=str(exc))
else:
# ret.data是一个字典,字典里是drf处理的异常信息
return response.APIResponse(code=0,msg="error",result=ret.data)
封装完毕之后,还需要在settings里配置一下,告诉drf采用我们封装的异常处理
# 放自己的全局异常
REST_FRAMEWORK = {
"EXCEPTION_HANDLER": "luffyapi.utils.exceptions.common_exception_handler",
}