【愚公系列】2022年04月 Python教学课程 77-DRF框架之异常

【愚公系列】2022年04月 Python教学课程 77-DRF框架之异常,第1张

文章目录
  • 一、DRF框架自带异常
  • 二、自定义异常


一、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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/724468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存