39 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
| from django.core.exceptions import PermissionDenied
 | |
| from django.http import Http404
 | |
| from rest_framework.response import Response
 | |
| from rest_framework import exceptions
 | |
| from rest_framework.views import set_rollback
 | |
| from django.utils.translation import gettext_lazy as _
 | |
| import traceback
 | |
| from server.settings import myLogger
 | |
| 
 | |
| def custom_exception_hander(exc, context):
 | |
|     """
 | |
|     自定义异常处理
 | |
|     """
 | |
|     if isinstance(exc, Http404):
 | |
|         exc = exceptions.NotFound()
 | |
|     elif isinstance(exc, PermissionDenied):
 | |
|         exc = exceptions.PermissionDenied()
 | |
| 
 | |
|     request_id = getattr(context['request'], 'request_id', None)
 | |
|     if isinstance(exc, exceptions.APIException):
 | |
|         headers = {}
 | |
|         if getattr(exc, 'auth_header', None):
 | |
|             headers['WWW-Authenticate'] = exc.auth_header
 | |
|         if getattr(exc, 'wait', None):
 | |
|             headers['Retry-After'] = '%d' % exc.wait
 | |
| 
 | |
|         if isinstance(exc.detail, (list, dict)):
 | |
|             data = {'err_detail':exc.detail}
 | |
|             data['err_code'] = exc.default_code
 | |
|             data['err_msg'] = exc.default_detail
 | |
|         else:
 | |
|             data = {'err_msg': exc.detail, 'err_code':exc.get_codes()}
 | |
| 
 | |
|         set_rollback()
 | |
|         data['request_id'] = request_id
 | |
|         return Response(data, status=exc.status_code, headers=headers)
 | |
|     err_str = traceback.format_exc()
 | |
|     myLogger.error('{}-{}'.format(request_id, err_str))
 | |
|     return Response(data={'err_code':'server_error', 'err_msg':'服务器错误', 'request_id': request_id}, status=500) |