drf篇:全局异常处理
全局异常处理(重要)
使用drf的异常处理可以捕获drf的报错信息,但是django或者原生python的报错信息也需要我们处理,这些捕获到的信息都需要我们封装好发送到前端,这是我们全局处理异常的目的。
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
# drf配置文件中,已经配置了,但是它不符合咱们的要求
# drf的配置文件:'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
# 如果抛了异常,就会执行exception_handler函数
# 重新写一个函数,如果出了异常,执行我们的函数
# drf默认的异常处理,只处理了drf自己的异常:所有drf中抛的异常,都有detail,django的异常,抛出很长的xml数据
{
"detail": "小伙子,你错了"
}
{
code:999
msg:"小伙子,你错了"
}
使用步骤
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
# 第一步:写一个函数
from rest_framework.views import exception_handler
from rest_framework.response import Response
def common_exception_handler(exc, context):
# 正常来讲,在这里需要记录日志---》如何在django中记录日志后面讲
# 日志记录,越详细越好:哪个用户(id,ip),在什么时间,执行哪个视图函数时报了错,请求地址是什么
# context里面有什么:{'view': <app01.views.LoginView object at 0x00000181FA935BE0>, 'args': (), 'kwargs': {}, 'request': <rest_framework.request.Request: POST '/user/user/'>}
print(context['view']) #视图类的对象
print(context['request']) #当前请求的对象----》ip,用户id,当前时间,请求地址来
view=context['view']
request=context['request']
print('ip地址为:%s的用户,访问:%s 视图类,报错了,请求地址是:%s'%(request.META.get('REMOTE_ADDR'),str(view),request.path))
response=exception_handler(exc, context)
if response: # 这是drf的异常,其实人家已经处理了,但是不符合我的格式 {code:999,msg:错误}
res=Response({'code':999,'msg':response.data.get('detail')})
else:
# res=Response({'code':998,'msg':'服务器错误,请联系系统管理员'})
res=Response({'code':998,'msg':str(exc)})
return res
# 第二步:把函数配置在配置文件中
REST_FRAMEWORK = {
# 自己写的全局异常捕获
'EXCEPTION_HANDLER': 'app01.exceptions.common_exception_handler',
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步