1. 程式人生 > 實用技巧 >drf自定義異常與封裝response物件

drf自定義異常與封裝response物件

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={})