custom exception handling drf

DRF custom exception handling

# 分析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

The admin the cipher text display

# 将admin中的密码密文显示
admin.py 
from django.contrib.auth.admin import UserAdmin
admin.site.register(models.User,UserAdmin)

Guess you like

Origin www.cnblogs.com/Afrafre/p/11865652.html