完整代码

https://gitee.com/mom925/django-system

在settings.py中配置

  

REST_FRAMEWORK = {
"EXCEPTION_HANDLER": "utils.exception.CustomExceptionHandler", # 自定义的异常处理
}

exception.py文件

import logging
import traceback from django.http import Http404
from rest_framework.exceptions import AuthenticationFailed, APIException, PermissionDenied, ValidationError, \
MethodNotAllowed, Throttled, NotAuthenticated
from rest_framework.views import exception_handler, set_rollback from utils.MyResponse import ErrorResponse logger = logging.getLogger(__name__) def CustomExceptionHandler(ex, context):
"""
统一异常拦截处理
:param ex:
:param context:
:return:
"""
# print(type(ex))
msg = ""
code = 400
# 调用默认的异常处理函数
response = exception_handler(ex, context)
# print(type(ex), ex)
# print(response)
# print(response.data)
if isinstance(ex, AuthenticationFailed) or isinstance(ex, NotAuthenticated):
# 如果是身份验证错误
msg = '身份验证失败'
code = 401
if response.data.get('detail').code == 'no_active_account':
code = 400
msg = '账号或密码错误' elif isinstance(ex, Http404):
code = 400
msg = "接口地址不正确"
elif isinstance(ex, ValidationError):
# msg = str(ex)
msg = '请提交正确字段'
code = 400
if isinstance(response.data, dict):
if response.data.get('username'):
if response.data.get('username')[0].code == 'unique':
msg = '用户已存在'
else:
keys = list(response.data.keys())
s = ','.join(keys)
msg = '请提交正确' + s
elif isinstance(response.data, list):
msg = response.data[0] elif isinstance(ex, MethodNotAllowed):
# msg = str(ex)
msg = '没有该请求方法'
code = 400
elif isinstance(ex, Throttled):
msg = '请求太快了,请稍后再试'
code = 400
elif isinstance(ex, APIException):
set_rollback()
# msg = ex.detail
if isinstance(ex, PermissionDenied):
msg = f'您没有权限'
# msg = f'您没有权限 ({context["request"].method}: {context["request"].path})'
else:
msg = '错误'
# 手动抛异常时
if response.data.get('detail').code == 'manually':
msg = response.data.get('detail')
else:
logger.exception(traceback.format_exc())
else:
logger.exception(traceback.format_exc())
msg = '错误'
code = 400
return ErrorResponse(msg=msg, code=code)

Django rest_framework使用自定义异常的更多相关文章

  1. Django rest_framework 实用技巧

    前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用 ...

  2. Python之Django rest_Framework框架源码分析

    #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_fram ...

  3. Python之Django rest_Framework(2)

    实例化: v1 = ["view.xxx.path.Role","view.xxx.path.Group",] 可以循环,循环出来的每一个不能实例化 如果把v1 ...

  4. 七、django rest_framework源码之视图

    1 绪言 当大家看大这篇博文的时候,应该对Django rest_framework中的CBV有所了解了,大致来说就是通过定义类来继承APIView类,并在类中定义get.post.put.delet ...

  5. 五、django rest_framework源码之版本控制剖析

    1 绪论 Djangorest_framework的版本控制允许用户更改不同客户端之间的行为,且提供了许多不同的版本控制方案.版本控制由传入的客户端请求确定,可以基于请求URL,也可以基于请求标头. ...

  6. 四、django rest_framework源码之频率控制剖析

    1 绪言 权限判定之后的下一个环节是访问频率控制,本篇我们分析访问频率控制部分源码. 2 源码分析 访问频率控制在dispatch方法中的initial方法调用check_throttles方法开始. ...

  7. 二、django rest_framework源码之认证流程剖析

    1 绪言 上一篇中讲了django rest_framework总体流程,整个流程中最关键的一步就是执行dispatch方法.在dispatch方法中,在调用了一个initial方法,所有的认证.权限 ...

  8. django rest_framework中将json输出字符强制为utf-8编码

    最近在和日本外包合作开发JIRA对接发布系统的版本单时, 遇到这个问题. 就是我们这边的输出浏览器显示为中文,而到了JIRA端就出现乱码. 查了文档,原来django rest_framework的默 ...

  9. python之Django rest_framework总结

    一.rest api    a.api就是接口         如: - http://www.oldboyedu.com/get_user/                - http://www. ...

  10. CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境, 记坑篇

    CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境 CentOS7 + Python3 + D ...

随机推荐

  1. Mysql数据库查询之模糊查询

    一.什么是模糊查询模糊查询是根据一定的模式匹配规则,查找与指定条件相似或相符的数据.二.模糊查询实操通配符查询1.% 表示任意0个或多个字符形式一: select 查询字段 from 表名 where ...

  2. UIPath变量和参数

    一. UIPath变量   变量(Variables),变量是所有编程语言中必不可少的部分.对于UIPath来说自然也是如此,其承载了我们RPA流程中数据传递的重要作用.对于接触过编程的开发者来说,变 ...

  3. LabVIEW基于机器视觉的实验室设备管理系统(4)

    目录 行动计划 后面板连线 初始化 ​返回 ​ 注册 账号限制 查重账号或者姓名 确认密码 注册 效果演示 我们上一期制作完了给账户修改密码,那么我们这一期就来完成账户注册这一功能.老规矩哦,先来计划 ...

  4. C语言判断输入的正整数是否既是5又是7的整倍数。

    #include<stdio.h> void main() { int n;//定义变量 while (1) { scanf_s("%d", &n); if ( ...

  5. Flutter搭建

    目录 下载 Flutter SDK 配置 Flutter 环境变量及镜像 检查开发环境 参考 下载 Flutter SDK flutter官网下载:https://flutter.io/sdk-arc ...

  6. 提升开发技能:10个高级的JavaScript技巧

    前言 在这个快速发展的数字时代,JavaScript作为一种广泛应用的编程语言,其重要性愈发凸显.为了在竞争激烈的开发领域中保持竞争力,不断提升自己的技能是至关重要的.本文小编将您介绍10个高级的Ja ...

  7. SQL模糊查询语法思考

    模糊查询 sql语句: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 % :表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示 ...

  8. 深入了解UUID:生成、应用与优势

    一.引言 在当今数字化时代,唯一标识一个对象的能力变得越来越重要.UUID(Universally Unique Identifier,通用唯一标识符)应运而生,作为一种保证全球唯一性的标识方法,广泛 ...

  9. React 中虚拟DOM是什么,为什么需要它?

    注意:本节主要讲React中的虚拟DOM,但是虚拟DOM并不是React中特有的内容. 1. React 中虚拟 DOM是什么? 虚拟DOM是对真实DOM的描述,虚拟DOM是JS对象,实际上就是 JS ...

  10. 使用 VS 2019 将 c# 生成 DLL 动态链接库文件

    主要步骤: ChatGPT 的回答: 你可以尝试使用 Visual Studio 创建一个类库项目,然后将你写的两个类添加到该项目中,并进行编译,最终生成 DLL 文件.具体步骤如下: 打开 Visu ...