django统一处理异常

自定义异常处理中间件

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方式来处理全局异常

相关推荐
叫我:松哥2 小时前
python案例:基于python 神经网络cnn和LDA主题分析的旅游景点满意度分析
人工智能·python·神经网络·数据挖掘·数据分析·cnn·课程设计
2202_756749693 小时前
01 基于sklearn的机械学习-机械学习的分类、sklearn的安装、sklearn数据集及数据集的划分、特征工程(特征提取与无量纲化、特征降维)
人工智能·python·机器学习·分类·sklearn
大得3693 小时前
django的数据库原生操作sql
数据库·sql·django
王者鳜錸4 小时前
PYTHON从入门到实践-18Django从零开始构建Web应用
前端·python·sqlite
冗量4 小时前
PPT自动化 python-pptx - 8: 文本(text)
python·自动化·powerpoint
超级晒盐人4 小时前
用落霞归雁的思维框架推导少林寺用什么数据库?
java·python·系统架构·学习方法·教育电商
AI_RSER5 小时前
第一篇:【Python-geemap教程(三)上】3D地形渲染与Landsat NDVI计算
开发语言·python·3d·信息可视化·遥感·gee
WSSWWWSSW5 小时前
Python编程基础与实践:Python循环结构基础
开发语言·python
im_AMBER6 小时前
学习日志25 python
开发语言·python·学习
Blossom.1186 小时前
基于深度学习的医学图像分析:使用DeepLabv3+实现医学图像分割
人工智能·python·深度学习·yolo·目标检测·机器学习·迁移学习