在django rest中自定义错误消息

时间:2014-05-25 12:43:56

标签: python django rest django-rest-framework

我想从django rest框架中自定义错误响应。 这是来自django休息的诽谤错误回复..

{
    "style": [
        "This field is required."
    ], 
    "code": [
        "code must be in 60 to 120 chars."
    ]
}  

我想像....那样自定义它。

{
    "style": [
        "error_code":"20"
        "error_message":"This field is required."
    ], 
    "code": [
        "error_code":"22"
        "error_message":"code must be in 60 to 120 chars."
    ]
}  

1 个答案:

答案 0 :(得分:1)

我在显示错误时遇到了同样的问题。首先,您应该知道不能在列表(即"style": ["error_code": "20", "error_message": "This field is required."])中使用键值对,并且如果要将错误转换为此自定义类型,则应将类型更改为字典。一种简单的方法是,您可以拥有自己的自定义异常处理程序,然后告诉rest框架使用该异常处理程序来自定义您的异常。首先,您应该在项目settings.py中添加以下行:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.exception_handlers.custom_exception_handler', # You should add the path to your custom exception handler here.
}

这告诉所有异常都应通过此处理程序。之后,您应该添加python文件并在其中添加代码(使用前面提到的settings.py中的此文件路径)。在以下代码中,您可以看到此处理程序的示例:

from rest_framework.exceptions import ErrorDetail
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.
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)
    custom_data = {}

    if isinstance(response.data, dict):
        for key, value in response.data.items():
            if value and isinstance(value, list) and isinstance(value[0], ErrorDetail):
                custom_response[key] = {
                    "error_message": str(value[0]),
                    "error_code": response.status_code # or any custom code that you need
                }
            else:
                break

    if custom_data:
        response.data = custom_data
    return response

注意:这是一个简单的示例,您应该测试API以确保一切正常。