DRF:配置全局异常处理和日志结合

这篇具有很好参考价值的文章主要介绍了DRF:配置全局异常处理和日志结合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目目录结构

---study_drf

        ---study_drf

                ---settings.py

        ---utils

                ---log.py

                ---exception.py

项目依赖

Django==3.2
django-cors-headers==3.5.0
djangorestframework==3.12.2
djangorestframework-jwt==1.11.0
mysqlclient==2.1.1
pinyin==0.4.0 #拼音处理
PyJWT==1.7.1
fpdf==1.7.2 #生成pdf文件
APScheduler==3.10.1 #轻量级定时任务
redis==4.6.0  #操作redis数据库的

要使用drf的Response做为响应对象,需要先注册app

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',#使用rest_framework的Response需要注册
]

一、utils/log.py

1、setting.py配置日志

#######--配置日志,
#1、配置日志要保存的文件夹,创建文件夹
import time
BASE_LOG_DIR = os.path.join(BASE_DIR, 'logs')
ERROR_PATH_DIR = os.path.join(BASE_LOG_DIR,'error')
if not os.path.exists(ERROR_PATH_DIR):
    #如果logs/error/不存在,递归创建目录
    os.makedirs(ERROR_PATH_DIR)

ALL_PATH_DIR = os.path.join(BASE_LOG_DIR,'all')
if not os.path.exists(ALL_PATH_DIR):
    #如果logs/all/目录不存在,就递归创建(如果logs目录不存在,也会创建)
    os.makedirs(ALL_PATH_DIR)

#2、相关的日志配置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  # 设置已存在的logger不失效
    'filters': {
    },
    'formatters': {
        'standard': {
            'format': '[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d:%(funcName)s]:%(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        },
        'simple': {
            'format': '[%(asctime)s][%(levelname)s]:%(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': { #按照文件大小分割日志,将所有的日志信息都保存在这里
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_LOG_DIR,'all', 'debug.log'),
            'maxBytes': 1024 * 1024 * 50,  # 日志大小50M
            'backupCount': 5,
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
        #os.path.join(BASE_LOG_DIR,'error',f"{time.strftime('%Y-%m-%d')}.log")
        'time_file':{#按照时间分割日志,每周一新增一个日志文件,存error等级以上的日志
              'level': 'INFO',#日志的等级
              'class': 'logging.handlers.TimedRotatingFileHandler',
              'filename':os.path.join(BASE_LOG_DIR,'error',f"{time.strftime('%Y-%m-%d')}.log") ,#日志的文件名
              'when': 'D', #时间单位,S,M,H,D,'W0'(星期1),'W6'(星期天)
              'interval': 1,
              'backupCount': 5, #备份数量
              'formatter': 'standard', #使用的日志格式
              'encoding': 'utf-8',
        }

    },
    'loggers': {
        #INFO以上日志,打印在console,也写到以文件大小分割的日志中
        'django': {
            'handlers': ['console','file'],#handlers中存在的配置
            'level': 'INFO',
            'propagate': True
        },
        #error以上的日志写到按时间分割的日志文件中,同时打印在控制台
        'django.request': {
            'handlers': ['time_file'],#handlers中存在的配置
            'level': 'ERROR',
            'propagate': True
        },

    },
}

2、utils/log.py,拿到配置的日志处理对象,实现手动记录日志

#手动写日志
import logging

info_logger = logging.getLogger('django') #根据loggers配置handlers,将日志写到指定的地方
error_logger = logging.getLogger('django.request') #根据loggers配置handlers,将日志写到指定的地方

if __name__ == '__main__':
    #简单的使用例子,使用这个方法记录日志,可以记录详细的日志信息(在视图中使用)
    error_logger.exception(f'{__file__}/Test_log,method=post,error,django.request')

二、utils/exception.py

1.1、重写自己的drf全局异常模块

from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status
from utils.log import error_logger #写日志

#配置drf的全局异常处理,需要在settings中配置
def _exception_handler(exc,context):
    #exc是报错的异常对象,context是哪个模块的函数出现报错
    response = exception_handler(exc,context)
    # print(exc.detail.get('error'),exc.detail.get('code'))
    # print(exc,'异常对象')
    # print(context,'报错函数')
    # print(response,'返回对象')
    #response有两个结果:一个是None(系统处理),一个django处理后(但格式不符合要求)
    if not response:
        #当然可以在这里进行精细的捕获

        #将错误信息写到日志文件中,使用这个方法,可以把更多信息记录起来(不要使用error方法,记录的信息不详细)
        error_logger.exception(exc)
        return Response(data={'error':'系统内部错误,请稍后再重试','code':500},
                        status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    else:
        #djang处理的
        if type(response.data) == dict:
            detail = response.data.get('detail')
        elif type(response.data) == list:
            #特殊情况处理
            detail = response.data
            if len(detail) <=1:
                return Response(data={'error':detail[0], 'code': 400},
                                status=response.status_code)
            else:
                return Response(data={'error': detail, 'code': 416},
                                status=response.status_code)
        else:
            detail = response.data
        if detail:
            if '未找到。' == detail:
                detail = '查询不到该数据信息'
            if '无效页面。' == detail:
                detail = '该页面的数据查询不到,请确定要查询的页面数据是否存在'
            return Response(data={'error':detail,'code':400},status=response.status_code)
        else:
            #我在写认证时,raise AuthenticationFailed({'code': 410, 'msg': msg,'type':'报错'})
            #拿到这里抛出异常的信息和code
            return Response(data={'error':exc.detail.get('error'),'code':exc.detail.get('code')},status=response.status_code)

1.2、settings.py 在配置文件中使用全局异常处理文章来源地址https://www.toymoban.com/news/detail-523498.html

#### drf的配置,全局配置
REST_FRAMEWORK = {

    #2、配置全局异常处理
    'EXCEPTION_HANDLER': 'utils.exception._exception_handler',


}

到了这里,关于DRF:配置全局异常处理和日志结合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Python Django 之全局配置 settings 详解

    Python Django 之全局配置 settings 详解

    对应项目下的 apps.py 文件,如: 在根目录下添加 templates 文件夹,可实现跳转至对应名称的 HTML 页面 方式1:项目内创建 static 文件夹 方式2:项目外创建 static 文件夹

    2024年02月08日
    浏览(11)
  • Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver),前后端解决跨域问题(@CrossOrigin(局部解决)自定义跨域配置类(全局))

    Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver),前后端解决跨域问题(@CrossOrigin(局部解决)自定义跨域配置类(全局))

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 异常处理作用:用来解决整合系统中任意一个控制器抛出异常时的统一处理入口 传统单体架构下的处理方式 配置全局异常处理类 resolveException :当控制器方法出现异常时,如果该方法没有try...catch,则会进入当前方法 针

    2024年02月04日
    浏览(42)
  • 面试之 Python 框架 Flask、Django、DRF

    面试之 Python 框架 Flask、Django、DRF

    Django:大而全的框架。它的内部组件比较多,如 ORM、Admin、中间件、Form、ModelForm、Session、缓存、信号、CSRF等,功能也都很完善。 flask:微型框架,内部组件就比较少了,但是有很多第三方组件来扩展它,比如 wtform(与django的modelform类似,表单验证)、flask-sqlalchemy(操作数

    2024年02月05日
    浏览(13)
  • 5.使用日志+自定义全局异常过滤器

    5.使用日志+自定义全局异常过滤器

    刚开始写文章,封装Base基类的时候,添加了trycatch异常块,不过当时没有去记录日志,直接return了。有小伙伴劝我不要吃了Exception  其实没有啦,项目刚开始,我觉得先做好整体结构比较好。像是盖楼一样。先把楼体建造出来,然后再一步一步的美化完善。 基础的仓储模式已

    2024年02月08日
    浏览(8)
  • springboot全局异常处理和自定义异常处理

    在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。 GlobalExceptionHandler类: 自定义异常CustomException类: 通用返回类:AjaxResult 枚举类ResultCodeEnum:

    2024年02月04日
    浏览(6)
  • 【AntDesign】封装全局异常处理-全局拦截器

    【AntDesign】封装全局异常处理-全局拦截器

    目录 场景 1 定义全部异常处理类 2 替换request引用 3 代码优化 总结 本文前端用的是阿里的Ant-Design框架,其他框架也有全局拦截器,思路是相同,具体实现自行百度下吧 因为每次都需要调接口,都需要单独处理异常情况(code !=0),因此前端需要对后端返回的通用响应进行统

    2024年02月08日
    浏览(9)
  • Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    目录 一、单个控制器异常处理 1.1 控制器方法 1.2 编写出错页面 1.3 测试结果 二、全局异常处理 2.1 一个有异常的控制器类 2.2 全局异常处理器类 2.3 测试结果  三、自定义异常处理器 3.1 自定义异常处理器 3.2 测试结果 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列

    2024年02月16日
    浏览(10)
  • SpringBoot 全局异常统一处理:BindException(绑定异常)

    SpringBoot 全局异常统一处理:BindException(绑定异常)

    在Spring Boot应用中,数据绑定是一个至关重要的环节,它负责将HTTP请求中的参数映射到控制器方法的入参对象上。在这个过程中如果遇到问题,如参数缺失、类型不匹配或验证失败等,Spring MVC将会抛出一个 org.springframework.validation.BindException 异常。本文将深入解析 BindExceptio

    2024年01月18日
    浏览(8)
  • Flask 全局异常处理

    异常分为客户端异常和服务端异常,flask 中的异常处理分为三步走:异常注册、异常触发、异常处理。 关于客户端/服务端异常,先看段样例代码: 常用的异常注册的模式包括两种: 装饰器模式: @app.errorhandler 工厂模式: app.register_error_handler() 1.1.1 装饰器模式 使用装饰器模式

    2024年02月10日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包