DRF自定义异常处理
# 分析drf 框架APIView
dispatch方法 --- (try)handle_exception(exc) --- get_exception_handler() --- response = exception_handler(exc,context)
handle_excepton: 捕获异常处理,return response
get_exception_handler: settings.EXCEPTION_HANDLER
找exception_handler(exc,context)类去处理异常
'''
get 请求的四个参数
context:{
'view':self,
'args':getattr(self,'args',()),
'kwargs':getattr(self.'kwargs',{}),
'request':getattr(self,'request,None)
}
'''
# 重写异常,处理drf 没有处理的异常
# 重写 exception_handler 方法,response为None(表示没有处理),自行处理
1. settings 中配置 settings.EXCEPTION_HANDLER
REST_FRAMEWORK = {
# 自定义异常的路径
'EXCEPTION_HANDLER':'luffyapi.utils.exceptions.exception_handler'
}
2. utils.exceptions.py
# rest_framework.views 下的exception_handler处理了所有drf可控范围的异常
# 目的: 处理drf 未处理的异常
from rest_framework.views import exception_handler as drf_exception_handler
from .response import APIResponse
from .logging import logger
def exception_handler(exc,context):
# 还是调用了drf 的exception_handler方法,只需处理未处理的异常
response = drf_exception_handler(exc,context)
if response is None:
# drf 处理不了的异常
error_info = '[%s] [%s]'%(context['view'],exc)
logger.error(error_info)
return APIResponse(1, '服务器异常')
response.exception = True
return response
将admin中的密码密文显示
# 将admin中的密码密文显示
admin.py
from django.contrib.auth.admin import UserAdmin
admin.site.register(models.User,UserAdmin)