【问题标题】:Django Rest Framework : How to initialise & use custom exception handler?Django Rest Framework:如何初始化和使用自定义异常处理程序?
【发布时间】:2016-09-08 08:53:55
【问题描述】:

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'email': [u'This field is required.']})

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

这是我正在处理的Project Tree 的图像。

我错过了什么吗?

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

    为此,您的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
    

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 2020-06-10
      • 1970-01-01
      • 2023-03-26
      • 2013-08-03
      • 2020-03-06
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      相关资源
      最近更新 更多