在 Django 过滤器或中间件中构建高效的错误代码映射器



我正在将我的代码从JAX-RS休息服务迁移到Django-Rest Framework。JAX-RS 提供的一个很好的功能是Exception Mapper可以将各种组件抛出的不同异常映射到泛型映射。

例如,对用户进行身份验证的 API 调用可能由于以下原因而失败:

  1. 用户名错误 -- 错误代码 1000
  2. 密码错误 -- 错误代码 1001
  3. 数据库已关闭 - 错误代码 1002

我可能想将"1000"和"1001"映射到一个通用代码"5325",前端/设备团队可以将其解释为"用户名和密码不匹配">

在 JAX-RS 中,映射是在 REST 层完成的。实际上,我可以抛出一种异常并将其映射到要作为响应发送的错误代码。

我怎样才能在 Django 中实现相同的目标?

例如:

def process_checkout(request):
    //
    if request.user.is_authenticated :
        //then process checkout
    else:
      raise userNotAuthenticatedError

现在,middleware应该将"userNotAuthenticatedError"映射到错误代码,构造一个JSON响应(如{50000 :"user not authenticated"}(并将响应发送到客户端。

谢谢

Django REST 框架通过中央异常处理程序处理验证异常以及其他异常。在 Django REST Framework 3.0 中,ValidationError异常会上升到异常处理程序,因此您可以通过那里中继它们。在 Django REST Framework 2.4 中,验证错误处理是在序列化程序级别完成的,你必须在那里触发错误。

你需要在一个文件(my.app.views(中定义你的异常处理程序,并在你的Django设置中设置处理程序。

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my.app.views.exception_handler'
}

您需要确保设置异常处理程序。由于这是非常特定于情况的,因此以下内容应该可以帮助您入门:

from rest_framework.exceptions import ValidationError
from rest_framework.views import exception_handler
def custom_exception_handler(exc):
    # Call REST framework's default exception handler to get
    # the request to work from
    response = exception_handler(exc)
    if isinstance(exc, ValidationError):
        # Always return a 422 status code for validation errors
       response.status = 422
    return response

在您的情况下,您将触发新的异常,而不是更改响应的状态代码。

相关内容

最新更新