DRF自定义异常处理器:如何在错误信息中显示详细提示语
DRF自定义异常处理器:优化ValidationError的message字段显示
当前你的自定义异常处理器使用exc.default_detail获取提示信息,但对于ValidationError来说,这个值是通用的"Invalid input.",而具体的字段错误详情存储在response.data中。要实现更详细的message,可以针对性处理ValidationError类型的异常,提取所有字段的错误信息拼接成自定义提示。
修改后的异常处理器代码
from rest_framework.exceptions import ValidationError from rest_framework.views import exception_handler def my_exception_handler(exc, context): response = exception_handler(exc, context) if response is not None: error_code = 'unknown' if hasattr(exc, 'default_code') : error_code = exc.default_code message = '' # 专门处理ValidationError,提取所有错误详情 if isinstance(exc, ValidationError): error_messages = [] # 处理字段级错误(字典格式) if isinstance(response.data, dict): for field, errors in response.data.items(): for err in errors: error_messages.append(f"{field}: {err}") # 处理全局非字段级错误(列表格式) elif isinstance(response.data, list): error_messages.extend(response.data) # 拼接成最终提示,若没有提取到则用默认信息 message = '; '.join(error_messages) if error_messages else exc.default_detail elif hasattr(exc, 'default_detail'): message = exc.default_detail error = { "error": response.data, "code": error_code, 'message': message, } response.data = error return response
效果说明
修改后,发送非法数据时的响应会变成:
{ "error": { "email": [ "Enter a valid email address." ], "phone_number": [ "asd is not a valid phone" ] }, "code": "invalid", "message": "email: Enter a valid email address.; phone_number: asd is not a valid phone" }
你可以根据需求调整错误信息的拼接格式,比如用换行符\n替代分号,或者直接返回错误信息列表(把message设为error_messages即可)。
内容的提问来源于stack exchange,提问作者Mehdi Aria
相关产品推荐
相关产品推荐

