Django Rest Framework:如何初始化&使用自定义异常处理程序?

时间:2016-05-12 13:25:40

标签: python django exception-handling django-rest-framework

DRF新手在这里。

我试图通过自定义异常处理程序处理项目中的所有异常。基本上,我尝试做的是如果任何序列化程序无法验证数据,我想将相应的错误消息发送到我的自定义异常处理程序并相应地重新格式化错误。

我已将以下内容添加到 settings.py。

# DECLARATIONS FOR REST FRAMEWORK
REST_FRAMEWORK = {
    'PAGE_SIZE': 20,
    'EXCEPTION_HANDLER': 'main.exceptions.base_exception_handler',

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication'
    )
}

但是一旦我向项目中的任何端点发送了无效参数,我仍然会收到DRF验证器的默认错误消息。 (例如{u'电子邮件':[u'此字段是必填字段。']})

在相应的序列化程序验证函数上引发的错误,永远不会到达我的异常处理程序。

以下是我正在处理的Project Tree的图片。

我错过了什么吗?

提前谢谢。

1 个答案:

答案 0 :(得分:3)

要执行此操作,您的base_exception_handler应检查何时引发ValidationError异常,然后修改并返回自定义错误响应。

注意: 如果数据参数无效,则序列化程序会引发ValidationError异常,然后返回400状态。)

base_exception_handler中,我们将检查引发的异常是否属于ValidationError类型,然后修改错误格式并返回修改后的错误响应。

from rest_framework.views import exception_handler
from rest_framework.exceptions import ValidationError

def base_exception_handler(exc, context):
    # Call DRF's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)

    # check that a ValidationError exception is raised
    if isinstance(exc, ValidationError): 
        # here prepare the 'custom_error_response' and
        # set the custom response data on response object
        response.data = custom_error_response 

    return response