如何在django rest框架中覆盖异常消息

时间:2015-10-14 12:20:34

标签: python django django-rest-framework

我正在使用基于django类的视图和休息框架

object = self.get_object()

详细信息视图如果对象不存在,我会收到像

这样的请求
/user/10

然后我得到了这个回复

{"detail": "not found"}

现在我想自定义该响应

try:
   obj = self.get_object()
except:
   raise Exception("This object does not exist")

但那不起作用

2 个答案:

答案 0 :(得分:2)

我们可以实现custom exception handler function ,以便在对象不存在时返回自定义响应。

如果对象不存在,则引发Http404异常。因此,我们将检查引发的异常是否为Http404,如果是这种情况,我们将在响应中返回自定义异常消息。

from rest_framework.views import exception_handler
from django.http import Http404

def custom_exception_handler(exc, context):
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)

    if isinstance(exc, Http404):  
        custom_response_data = { 
            'detail': 'This object does not exist.' # custom exception message
        }
        response.data = custom_response_data # set the custom response data on response object

    return response

定义我们的自定义异常处理程序后,我们需要将此自定义异常处理程序添加到DRF设置中。

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}

答案 1 :(得分:1)

您可以按如下所示创建自定义异常类,它会使用custom messagecustom status_code引发 APIException

from rest_framework.serializers import ValidationError
from rest_framework import status



class CustomAPIException(ValidationError):
    """
    raises API exceptions with custom messages and custom status codes
    """
    status_code = status.HTTP_400_BAD_REQUEST
    default_code = 'error'

    def __init__(self, detail, status_code=None):
        self.detail = detail
        if status_code is not None:
            self.status_code = status_code


并在您的views中,

from rest_framework import status

try:
    obj = self.get_object()
except:
    raise CustomAPIException("This object does not exist", status_code=status.HTTP_404_NOT_FOUND)


响应将如下所示
{"detail": "This object does not exist"}

注意

detail类的CustomAPIException参数接受strlistdict对象。如果提供dict对象,则它将返回该字典作为异常响应

更新

@pratibha所述,如果我们在Serializer的validate()validate_xxfieldName()方法中使用此异常类,则无法产生所需的输出。

为什么会这样?
我在Django REST Framework ValidationError always returns 400这里写了一个类似的答案

如何在串行器的validate()方法中获得所需的输出?
CustomAPIException 而不是从rest_framework.exceptions.APIException继承 rest_framework.serializers.ValidationError
即,

from rest_framework.exceptions import APIException


class CustomAPIException(APIException):
    # .... code