我正在使用基于django类的视图和休息框架
object = self.get_object()
详细信息视图如果对象不存在,我会收到像
这样的请求/user/10
然后我得到了这个回复
{"detail": "not found"}
现在我想自定义该响应
像
try:
obj = self.get_object()
except:
raise Exception("This object does not exist")
但那不起作用
答案 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 message
和custom 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
参数接受str
,list
和dict
对象。如果提供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