一、DRF框架自带异常
REST 框架的视图处理各种异常,并处理返回适当的错误响应。
处理的异常包括:
在 REST 框架中定义的异常。APIException
404异常。Http404
权限异常。PermissionDenied
在每种情况下,REST 框架都将返回具有适当状态代码和内容类型的响应。响应的正文将包含有关错误性质的任何其他详细信息。
大多数错误响应将在响应正文中包含一个键。detail
例如,以下请求:
DELETE http://api.example.com/foo/bar HTTP/1.1 Accept: application/json
可能会收到一个错误响应,指示该资源上不允许使用该方法:
HTTP/1.1 405 Method Not Allowed Content-Type: application/json Content-Length: 42 {"detail": "Method 'DELETE' not allowed."}
验证错误的处理方式略有不同,并且将在响应中包含字段名称作为键。如果验证错误不是特定于特定字段的,则它将使用“non_field_errors”键,或者为该设置设置设置的任何字符串值。
示例验证错误如下所示:
HTTP/1.1 400 Bad Request Content-Type: application/json Content-Length: 94 {"amount": ["A valid integer is required."], "description": ["This field may not be blank."]}
二、自定义异常
您可以通过创建一个处理程序函数来实现自定义异常处理,该函数将 API 视图中引发的异常转换为响应对象。这允许您控制 API 使用的错误响应样式。
该函数必须采用一对参数,第一个是要处理的异常,第二个是包含任何额外上下文(如当前正在处理的视图)的字典。异常处理程序函数应返回对象,如果无法处理异常,则应返回。如果处理程序返回,则将重新引发异常,Django将返回标准的HTTP 500“服务器错误”响应。
例如,确保所有错误响应在响应正文中都包含 HTTP 状态代码,如下所示:
HTTP/1.1 405 Method Not Allowed Content-Type: application/json Content-Length: 62 {"status_code": 405, "detail": "Method 'DELETE' not allowed."}
为了更改响应的样式,可以编写以下自定义异常处理程序:
from rest_framework.views import exception_handler 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) # Now add the HTTP status code to the response. if response is not None: response.data['status_code'] = response.status_code return response
上下文参数不由默认处理程序使用,但如果异常处理程序需要更多信息(如当前正在处理的视图),则可以使用上下文参数,该视图可作为 访问。
还必须使用设置键在设置中配置异常处理程序。例如:
REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler' }
如果未指定,则该设置默认为 REST 框架提供的标准异常处理程序:
REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler' }
请注意,将仅对引发的异常生成的响应调用异常处理程序。它不会用于视图直接返回的任何响应,例如在序列化程序验证失败时由泛型视图返回的响应。HTTP_400_BAD_REQUEST