自定义异常处理中间件
1、先创建自定义异常类
该类必须包含两个方法init,call
init用于初始化
call用于处理请求
python
from django.http import JsonResponse
class GlobalExceptionMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
try:
response = self.get_response(request)
except Exception as e:
print(type(e))
return JsonResponse({
'code': -1,
'msg': str(e)
})
return response
1)call方法是为了让类的实例像函数一样被调用,如GlobalExceptionMiddleware(xxx),就会直接执行类中的call方法
2)get_response 是一个可调用对象(通常是一个函数),它的作用是处理请求,调用下一个中间件或视图函数,并生成响应
3)get_response 的返回值是一个 HttpResponse 对象,表示处理后的响应
4)当你调用 self.get_response(request) ,如果还有其他中间件,get_response 会调用下一个中间件,如果没有更多中间件,get_response 会调用最终的视图函数来处理请求
2、注册中间件到settings文件中
中间件注册是类级别的
python
MIDDLEWARE = [
# 'django.middleware.security.SecurityMiddleware',
# 'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.middleware.common.CommonMiddleware',
# # 'django.middleware.csrf.CsrfViewMiddleware',
# #'django.contrib.auth.middleware.AuthenticationMiddleware',
# #'django.contrib.messages.middleware.MessageMiddleware',
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'middlewares.my_middleware.GlobalExceptionMiddleware',
]
3、settings文件中添加该配置
DEBUG_PROPAGATE_EXCEPTIONS = True #该配置是让中间件处理异常,避免django自己处理异常
继承MiddlewareMixin重写process_exception
1、创建自定义中间件类继承MiddlewareMixin重写process_exception方法
python
from django.utils.deprecation import MiddlewareMixin
from django.http import JsonResponse
class MyMiddleware(MiddlewareMixin):
# 当视图中出现异常时,会捕获到
def process_exception(self, request, exception):
return JsonResponse({'code': -1, 'msg': str(exception)})
2、注册自定义中间件到settings中
python
MIDDLEWARE = [
# 'django.middleware.security.SecurityMiddleware',
# 'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.middleware.common.CommonMiddleware',
# # 'django.middleware.csrf.CsrfViewMiddleware',
# #'django.contrib.auth.middleware.AuthenticationMiddleware',
# #'django.contrib.messages.middleware.MessageMiddleware',
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'middlewares.my_middleware.MyMiddleware',
]
3、可以不指定DEBUG_PROPAGATE_EXCEPTIONS = True
注意:该方式只能处理视图中触发的异常,如果是视图之外的异常如中间件调用出现的异常则处理不了,只能使用第一种重写call方式来处理全局异常