DRF的异常处理
2024-08-24 15:52:06
默认情况下,DRF框架通过内置的 exception_handler
方法,处理了如下异常:
- django内置异常
- Http404
- PermissionDenied
DRF框架异常
- APIException - DRF 框架异常的父类,以下为它的子类
- NotFound 未找到
- PermissionDenied 权限拒绝
- ParseError 解析错误
- AuthenticationFailed 认证失败
- NotAuthenticated 尚未认证
- MethodNotAllowed 请求方式不支持
- Throttled 超过限流次数
- ValidationError 校验失败
- NotAcceptable 要获取的数据格式不支持
如果
exception_handler
方法处理异常成功,则返回一个Response对象,否则返回None
如果发生了上面的这些异常,DRF框架的excaption_handler函数可以自动捕获异常,然后进行处理,返回Response对象。如果不是上面的这些异常,则处理不了,返回None。
那我们在生产环境中,需要把全部异常捕获,输入到日志中。而且我们也不希望给错误页面给用户看到,这时候应该怎么办呢?
这时候可以针对 DRF 框架没有处理的一些特殊的异常,进行全局的异常处理。
示例:
from rest_framework.response import Response
from rest_framework.views import exception_handler def custom_exception_handler(exc, context):
# 先调用DRF默认的 exception_handler 方法, 对异常进行处理,
# 如果处理成功,会返回一个`Response`类型的对象
response = exception_handler(exc, context) if response is None:
# 项目出错了,但DRF框架对出错的异常没有处理,
# 可以在此处对异常进行统一处理,比如:保存出错信息到日志文件
view = context['view'] # 出错的视图
error = '服务器内部错误, %s' % exc
print('%s: %s' % (view, error))
return Response({'detail': error}, status=500) return response
最后还需要在配置文件中声明自定义的异常处理
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'DjangoREST.exceptions.custom_exception_handler'
}
这时候如果有其他异常出现,就可以捕获并且处理啦,也能返回Response对象。
最新文章
- TypeScript
- EMC与地之重新认识地
- (转)listview中常见难题总结
- android之merge布局
- ubuntu vnc install
- VB.NET Shared(共享)和 Static(静态)关键字的区别
- windows下fitness python版本安装测试
- 详解JDBC连接数据库
- 隐藏input的光标
- mysql多个TimeStamp设置(转)
- parse_str() 函数把查询字符串解析到变量中。
- 初识Djiango
- 展开被 SpringBoot 玩的日子 《 一 》入门篇
- LVS,Keepalived,HAproxy区别与联系
- linux 系统调用之文件操作
- L2-024. 部落(并查集)*
- 使用siege执行压力测试
- js第三天知识点 循环
- 将一个浮点数转换成人民币读法字符串(java)
- mysql保留2位小数字段如何设置 浮点数
热门文章
- php自学笔记2
- java正则表达式 3 -- 查找
- 【转】 cocos2dx 3.x C++搭建protobuf环境
- Hibernate关联映射之_一对多
- [Leetcode] String to integer atoi 字符串转换成整数
- C++——拷贝构造函数说明
- HTML5 Canvas圣诞树
- RTL2832U+R820T电视棒windows下安装sdr# 以及搭建ADS-B使用VirtualRadar看飞机的教程
- Codeforces Round #478 C. Valhalla Siege
- javascript简易下拉菜单效果