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', }