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 ...
随机推荐
- STM8 STM32 GPIO 细节配置问题
在MCU的GPIO配置中我们经常需要预置某一 IO 上电后为某一固定电平, 如果恰好我们需要上电后的某IO为高电平, 那么在配置GPIO的流程上面需要特别注意. 配置如下: (以下问题仅在STM8 / ...
- gametime
这道题是动态调试的考点,看了wp才有思路 像这样的游戏题一定要搞清楚他的具体游戏流程才能更好的做出来,然后根据他的思路去改掉相关的判断就可以了 攻防世界逆向高手题之gametime_攻防世界 game ...
- 【uniapp】【外包杯】学习笔记day07 | 微信小程序轮播图、分类导航、楼层图的开发与实现
1.创建home分支 2.配置网络请求 由于平台的限制,现需要建立uni-app中使用第三方包请求网络数据请求 在 uni-app 项目中使用 @escook/request-miniprogram ...
- weblogic端口号和内存怎么修改?
在WebLogic中修改端口号和内存分配是一项重要的任务,它涉及到服务器性能和应用程序的可靠性.下面我将详细介绍如何修改WebLogic的端口号和内存设置. 修改端口号 WebLogic使用多个端口来 ...
- DDD学习与感悟——总是觉得自己在CRUD怎么办?
一.DDD是什么? DDD全名叫做Domins drives Design:领域驱动设计.再说的通俗一点就是:通过领域建模的方式来实现软件设计. 问题来了:什么是软件设计?为什么要进行软件设计? 软件 ...
- [ABC263G] Erasing Prime Pairs
Problem Statement There are integers with $N$ different values written on a blackboard. The $i$-th v ...
- 在IDEA启动多个Spring Boot工程实例
在IDEA上点击Application右边的下三角 ,弹出选项后,点击Edit Configuration 选中需要多实例启动的应用,将默认的Single instance only(单实例)的钩去掉 ...
- 玩转Python:数据可视化,一个很高级的交互式Python库,附代码
在数据科学和分析的世界里,将数据可视化是至关重要的一步,它能帮助我们更好地理解数据,发现潜在的模式和关系.Python 提供了多种可视化工具,HvPlot 是其中一个出色的库,专为简单且高效的交互式可 ...
- zabbix+oracle环境部署
oracle11安装完成后, 实例名: zbx01 oracle创建zbx01用户:col file_name for a60;set linesize 160;select file_name,ta ...
- Java播放MP3播放音频
Java播放MP3播放音频 下面我演示用jdk自带包.框架等分别展示播放mp3.等music 一.使用javafx包 AudioClip 注意jdk11以上剥离了javafx public stati ...