drf框架的異常處理

drf框架對本身內部定義的方法作了特殊處理 好比:頻率控制組件 返回特殊的信息服務器

如何在drf異常處理的基礎上再從新包裝異常app

from rest_framework.views import exception_handler
from rest_framework.response import Response
import logging

error_log = logging.getLogger('')


def custom_exception_handler(exc, context):
    '''重定義異常(使異常返回值符合規範)'''
    # 先讓drf內部作處理
    response = exception_handler(exc, context)
    # drf處理過得異常 能夠按照本身的規範來返回
    if response:
        '''drf內部錯誤'''
        print(response.data)
        detail = response.data.get('detail')
        non_field_errors = response.data.get('non_field_errors')
        if detail:
            return Response({"code": 1001, "msg": detail})

        if non_field_errors:
            return Response({"code": 1001, "msg": non_field_errors[0]})
        return response
    # 沒有通過drf處理的異常好比代碼報錯 咱們能夠捕捉下來寫入日誌
    else:
        '''異常寫入日誌'''
        error_views = context['view']
        error_info = repr(exc)
        error_line = []
        trace = exc.__traceback__
        while trace:
            error = '"%s"  line %s' % (trace.tb_frame.f_code.co_filename, trace.tb_lineno)
            print('\033[31;0mERROR: %s \033[0m' % error)
            error_line.append(error)
            trace = trace.tb_next
        print('\033[31;0m%s \033[0m' % error_info)
        # error_log.error(f'error_views:{error_views} | error_info:{error_info} | error_line:{error_line[::-1]}')
        error = '服務器內部錯誤'

        return Response({"code": 1001, "msg": error}, status=500)

 

 

# 在配置文件中配置生效

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'background.utils.exception.custom_exception_handler',
}
相關文章
相關標籤/搜索