如何在django rest框架中使用自定义错误码抛出自定义异常,并覆盖异常响应中的默认字段



我想知道如何在django rest框架中抛出自定义异常,其中包含自定义error_code和自定义消息。我对APIException()不感兴趣,因为这个函数不允许在飞行中设置错误代码。另外,我想知道如何更改异常消息的details key json响应

我找到了解决我所有问题的方法

api_exceptions.py

from rest_framework.views import exception_handler
from rest_framework.exceptions import APIException

custom_exception_handler

def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)
    if response is not None:
        response.data['status_code'] = response.status_code
        #replace detail key with message key by delete detail key
        response.data['message'] = response.data['detail']
        del response.data['detail']
    return response

CustomApiException

class CustomApiException(APIException):
    #public fields
    detail = None
    status_code = None
    # create constructor
    def __init__(self, status_code, message):
        #override public fields
        CustomApiException.status_code = status_code
        CustomApiException.detail = message

settings.py

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utilities.helpers.api_exceptions.custom_exception_handler',
}

your_view.py

raise CustomApiException(333, "My custom message")
#json response
{
  "status_code": 333,
  "message": "My custom message"
}
from rest_framework import exceptions
class ServiceUnavailableError(exceptions.APIException):
    status_code = status.HTTP_503_SERVICE_UNAVAILABLE
    default_detail = "Service unavailable."
# your views.py
raise ServiceUnavailableError("Override message.")

您可以使用返回字典的简单函数:

def response_error_message(dic, message="An error occurred please try again later.", http_status=None):
    dic["status_code"] = http_status or status.HTTP_500_INTERNAL_SERVER_ERROR
    dic["object"] = message
    dic["success"] = False

和视图中的调用:

...
responsedic = {}
response_error_message(response_dic, message='Custom message', http_status=Custom_http_status)
return Response(response_dic)

最新更新