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

时间:2014-12-06 00:27:21

标签: django jax-rs django-rest-framework django-middleware

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

一个示例是,对用户进行身份验证的API调用可能会失败,原因如下:

  1. 用户名错误 - 错误代码1000
  2. 密码错误 - 错误代码1001
  3. 数据库已关闭 - 错误代码1002
  4. 我可能想映射" 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"},并将响应发送给客户端。

    由于

1 个答案:

答案 0 :(得分:1)

Django REST Framework通过central exception handler处理验证异常以及其他异常。在Django REST Framework 3.0中,ValidationError异常进入异常处理程序,因此您可以通过那里中继它们。在Django REST Framework 2.4中,验证错误处理是在序列化程序级别完成的,您必须在那里触发错误。

您需要在Django设置中的文件(my.app.views)和set up the handler中定义异常处理程序。

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

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