DRF自定义错误异常替换detail信息

简介: 因为自己写api定义了一套格式,但是django rest_framework的异常提醒又跟我的不一样, 要么是:

因为自己写api定义了一套格式,但是django rest_framework的异常提醒又跟我的不一样,

要么是:

2804911285.png

要么是

{
"detail":"身份错误"
}

实在是不统一!!!

如果不修改,前端调用的时候就得多写点逻辑,或者强迫症极度不适应

于是就有了这篇文章。

我看了下,网上对于这样的情况,没有针对的指出,所以特地的发表这篇问题。

嗯,drf关于异常处理写个了方法

def exception_handler(exc, context):
    """
    Returns the response that should be used for any given exception.
    By default we handle the REST framework `APIException`, and also
    Django's built-in `Http404` and `PermissionDenied` exceptions.
    Any unhandled exceptions may return `None`, which will cause a 500 error
    to be raised.
    """
    if isinstance(exc, Http404):
        exc = exceptions.NotFound()
    elif isinstance(exc, PermissionDenied):
        exc = exceptions.PermissionDenied()
    if isinstance(exc, exceptions.APIException):
        headers = {}
        if getattr(exc, 'auth_header', None):
            headers['WWW-Authenticate'] = exc.auth_header
        if getattr(exc, 'wait', None):
            headers['Retry-After'] = '%d' % exc.wait
        if isinstance(exc.detail, (list, dict)):
            data = exc.detail
        else:
            data = {'detail': exc.detail}
        set_rollback()
        return Response(data, status=exc.status_code, headers=headers)
    return None

这里出现detail的!!!!

而我们要做的,就是重写异常的方法

REST_FRAMEWORK = {
...
    'EXCEPTION_HANDLER': 'exception.handler.custom_exception_handler',
....
}

然后去获取这个detail,并且删除不必要的提示

from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)
    if response is not None:
        data = response.data.copy()
        response.data.clear()
        text = ''
        for k, v in data.items():
            text += f'{k}: {v}'
        response.data['error'] = text
    return response

经过这样的处理,

就能变成这样的干净

1421397021.png


目录
相关文章
|
8月前
|
数据安全/隐私保护 开发框架
flea-auth使用之用户子模块介绍
本篇 Huazie 介绍 Flea 框架下的 flea-auth 模块中的 用户子模块
92 1
flea-auth使用之用户子模块介绍
|
8月前
|
数据格式
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
977 0
|
5月前
|
存储 C#
【Azure APIM】APIM 策略语句如何读取请求头中所携带的Cookie信息并保存为变量
【Azure APIM】APIM 策略语句如何读取请求头中所携带的Cookie信息并保存为变量
|
6月前
|
Java 数据库连接 应用服务中间件
表单数据返回不到,HTTP状态 404 - 未找未找到,解决方法,针对这个问题,写一篇文章,理一下思路,仔细与原项目比对,犯错的原因是Mapper层的select查询表单数据写错,注意打开的路径对不对
表单数据返回不到,HTTP状态 404 - 未找未找到,解决方法,针对这个问题,写一篇文章,理一下思路,仔细与原项目比对,犯错的原因是Mapper层的select查询表单数据写错,注意打开的路径对不对
|
数据安全/隐私保护
fastadmin中写接口是时Validate规则验证自定义如何用
fastadmin中写接口是时Validate规则验证自定义如何用
288 0
|
Android开发
跨程序共享数据——Content Provider 之 ContentResolver基本用法 & 一个读取系统联系人的Demo
跨程序共享数据——Content Provider 之 ContentResolver基本用法 & 一个读取系统联系人的Demo
|
SQL JSON Java
Mybaties分页插件使用, 参数校验以及全局异常处理
本文教你快速进行Mybaties分页插件使用, 参数校验以及全局异常处理
|
存储 JSON 数据格式
fastapi 请求文件 / 表单 / 处理错误 / 路径操作配置 / jsonable_encoder
fastapi 请求文件 / 表单 / 处理错误 / 路径操作配置 / jsonable_encoder
469 0
fastapi 请求文件 / 表单 / 处理错误 / 路径操作配置 / jsonable_encoder
|
前端开发 PHP
无参数名post数据客户端以及接口是如何实现的?
无参数名post数据客户端以及接口是如何实现的?
285 0
|
Android开发
跨程序共享数据——Content Provider 之 ContentResolver基本用法 & 一个读取系统联系人的Demo
本模块共有四篇文章,参考郭神的《第一行代码》,对Content Provider的学习做一个详细的笔记,大家可以一起交流一下: 跨程序共享数据——Content Provider 之 运行时权限解析以及申请的实现(可完美解决java.
1380 0

热门文章

最新文章