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


目录
相关文章
|
数据库 索引
评论功能里数据库的设计
【4月更文挑战第2天】本文探讨了评论系统的树形结构设计,提出了四种方法:邻接表、分段式path、Nested Set和Closure Table。针对评论业务功能,如加载评论页和查看回复,优先考虑邻接表和分段式path。采用邻接表思路,设计了评论表结构,包括Uid、Biz、BizID、RootID、PID、Content、索引和级联删除规则。同时提到了索引设计,如Uid、Biz+BizID、PID和Ctime/Utime,以优化查询性能。
280 3
|
开发工具 Python
Django使用支付宝SDK完整网站应用支付。
Django使用支付宝SDK完整网站应用支付。
597 0
|
API 网络架构 Python
Django生成接口文档
Django生成接口文档
433 0
|
前端开发
若依(ruoyi)前端Vue3 Element Plus Vite版样式修改
若依(ruoyi)前端Vue3 Element Plus Vite版样式修改
2257 0
|
IDE Go 开发工具
【Go·编辑器IDE】GoLand集成开发环境安装及使用教程
【Go·编辑器IDE】GoLand集成开发环境安装及使用教程
【Go·编辑器IDE】GoLand集成开发环境安装及使用教程
微信分享报错 wxlog:Error:fail to load Keychain status:-25300 解决办法
微信分享报错 wxlog:Error:fail to load Keychain status:-25300 解决办法
3121 0
|
11月前
|
存储 Python
使用django构建一个多级评论功能
使用django构建一个多级评论功能
139 0
|
安全 API 数据安全/隐私保护
Django REST framework安全实践:轻松实现认证、权限与限流功能
Django REST framework安全实践:轻松实现认证、权限与限流功能
|
测试技术 开发者 Python
Django 工程目录结构设计
Django 工程目录结构
8921 0
|
测试技术 持续交付 Docker
Django中的自动化部署与持续集成实践
【4月更文挑战第15天】本文介绍了Django项目中自动化部署与持续集成的实践方法。自动化部署通过选择Ansible、Fabric或Docker等工具,编写部署脚本,配置持续集成工具(如Jenkins、GitLab CI),确保服务器环境一致,实现快速应用上线。持续集成则涉及配置版本控制系统,设置自动化构建和测试,编写全面的测试用例,集成代码质量检查工具,并配置通知机制,以提升代码质量和开发效率。这两者结合能有效提升项目的迭代速度和可靠性。