Django rest_framework使用自定义异常
完整代码
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使用自定义异常的更多相关文章
- Django rest_framework 实用技巧
前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用 ...
- Python之Django rest_Framework框架源码分析
#!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_fram ...
- Python之Django rest_Framework(2)
实例化: v1 = ["view.xxx.path.Role","view.xxx.path.Group",] 可以循环,循环出来的每一个不能实例化 如果把v1 ...
- 七、django rest_framework源码之视图
1 绪言 当大家看大这篇博文的时候,应该对Django rest_framework中的CBV有所了解了,大致来说就是通过定义类来继承APIView类,并在类中定义get.post.put.delet ...
- 五、django rest_framework源码之版本控制剖析
1 绪论 Djangorest_framework的版本控制允许用户更改不同客户端之间的行为,且提供了许多不同的版本控制方案.版本控制由传入的客户端请求确定,可以基于请求URL,也可以基于请求标头. ...
- 四、django rest_framework源码之频率控制剖析
1 绪言 权限判定之后的下一个环节是访问频率控制,本篇我们分析访问频率控制部分源码. 2 源码分析 访问频率控制在dispatch方法中的initial方法调用check_throttles方法开始. ...
- 二、django rest_framework源码之认证流程剖析
1 绪言 上一篇中讲了django rest_framework总体流程,整个流程中最关键的一步就是执行dispatch方法.在dispatch方法中,在调用了一个initial方法,所有的认证.权限 ...
- django rest_framework中将json输出字符强制为utf-8编码
最近在和日本外包合作开发JIRA对接发布系统的版本单时, 遇到这个问题. 就是我们这边的输出浏览器显示为中文,而到了JIRA端就出现乱码. 查了文档,原来django rest_framework的默 ...
- python之Django rest_framework总结
一.rest api a.api就是接口 如: - http://www.oldboyedu.com/get_user/ - http://www. ...
- CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境, 记坑篇
CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境 CentOS7 + Python3 + D ...
随机推荐
- 「保姆级」网络爬虫教程(二):教你下载文库中的PDF文档!
如何点赞再看,养成习惯.微信公众号搜索「Job Yan」关注这个爱发技术干货的 Coder.本文 GitHub https://github.com/JobYan/PythonPearls 已收录,还 ...
- 1. 手动移植FreeRTOS V9.00到 Stm32F103C8T6
记录移植过程,以便以后查看: 附上FreeRTOS源码和 测试文件: 链接:https://pan.baidu.com/s/1v6nvDOk4-2NILYqN3njGjQ 提取码:1234 1.使用 ...
- Codeforces Round #736 (Div. 2). D - Integers Have Friends
原题:D - Integers Have Friends 题意: 给定一个数组,求一个最长子数组满足\(a_i \,\, mod \,\, m \,\, = \,\, a_{i + 1} \,\, m ...
- Mysql报:error while loading shared libraries libtinfo.so.5的解决办法
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin #.今天闲来无事,想在Anolis8的系统上装一个MySQL8.0玩.前期在安装和配置的过程中没有什么问题,但是在我想 ...
- 思科4331 语音网关配置, cisco 4331 router 配置文件
GW01#cisco_ROUTER01#cisco_ROUTER01#sh clocisco_ROUTER01#cisco_ROUTER01#cisco_ROUTER01#cisco_ROUTER01 ...
- [ABC263F] Tournament
Problem Statement $2^N$ people, numbered $1$ to $2^N$, will participate in a rock-paper-scissors tou ...
- springboot——yaml格式
- C++学习笔记九:值,常量,常表达式和常初始化
1. 值: Literal: Data that is directly represented in code without going through some other variable s ...
- C++学习笔记五:变量与数据类型(Auto类型)
Auto 允许编译器自己来推断变量的类型,这种新功能是在c++11引入的.这个关键字结合for循环使用可以节省变量类型的重复输入.VS Code可以在鼠标移动到变量上之后直接显示变量的类型. auto ...
- 推荐一款功能齐全的开源MES/万界星空科技mes
推荐一款功能齐全的开源MES 万界星空科技商业开源MES可以提供包括制造数据管理.计划排程管理.生产调度管理.库存管理.质量管理.人力资源管理.工作中心/设备管理.工具工装管理.采购管理.成本管理.项 ...