drf自定義異常與封裝response物件
阿新 • • 發佈:2020-07-17
1 異常處理
REST framework提供了異常處理,我們可以自定義異常處理函式。
#統一介面返回 # 自定義異常方法,替換掉全域性 # 寫一個方法 # 自定義異常處理的方法 from rest_framework.views import exception_handler from rest_framework.response import Response from rest_framework import status # 自定義異常處理的方法 def my_exception_handler(exc, context): response = exception_handler(exc, context) # 兩種情況,一個是None,drf沒有處理 # response物件,django處理了,但是處理的不符合咱們的要求 # print(type(exc)) if not response: if isinstance(exc, ZeroDivisionError): return Response(data={'status': 777, 'msg': '除以0錯誤' + str(exc)}, status=status.HTTP_400_BAD_REQUEST) return Response(data={'status': 888, 'msg': str(exc)}, status=status.HTTP_400_BAD_REQUEST) else: return Response(data={'status': 999, 'msg': response.data.get('detail')}, status=status.HTTP_400_BAD_REQUEST) # 全域性配置setting.py REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'app01.res.my_exception_handler', } # 如果未宣告,會採用預設的方式,如下 rest_frame/settings.py REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler' }
1.1 REST framework定義的異常
REST framework定義的異常
APIException 所有異常的父類
ParseError 解析錯誤
AuthenticationFailed 認證失敗
NotAuthenticated 尚未認證
PermissionDenied 許可權決絕
NotFound 未找到
MethodNotAllowed 請求方式不支援
NotAcceptable 要獲取的資料格式不支援
Throttled 超過限流次數
ValidationError 校驗失敗
也就是說,很多的沒有在上面列出來的異常,就需要我們在自定義異常中自己處理了。
2 封裝Response物件
from rest_framework.response import Response from rest_framework import status class APIResponse(Response): def __init__(self, code=100, msg='成功', data=None, status=None, headers=None, **kwargs): dic = {'code': code, 'msg': msg} if data: dic = {'code': code, 'msg': msg, 'data': data} dic.update(kwargs) super().__init__(data=dic, status=status, headers=headers) # 使用 return APIResponse(data={"name":'hjj'},token='asdasvg',aa='dasggasd') return APIResponse(data={"name":'hjj'}) return APIResponse(code='101',msg='錯誤',data={"name":'hjj'},token='dsafsdfa',aa='dsafdsafasfdee',header={})