django 捕获异常和日志系统过程详解


Posted in Python onJuly 18, 2019

这一块的内容很少, 异常使用try except即可, 日志只需要几行配置.

使用装饰器捕获方法内的所有异常

我使用装饰器来整个包裹一个方法, 捕获方法中的所有异常信息.并将其转为json返回客户端.

import functools

def catch_exception(func, code=500, *args, **kwargs):
  '''
  :param func:
  :return:
  '''

  @functools.wraps(func, *args, **kwargs)
  def nefen(request, *args, **kwargs):
    try:
      back = func(request, *args, **kwargs)
      return back
    except Exception as e:
      # string = "捕获到异常"
      # x = type(e)
      #
      # if x == ValueError:
      #   string = "数值转换异常:" + str(e)
      return JsonError(error_string=str(e), code=code)

  return nefen

JsonError是之前编写的json工具.

装饰器的使用方法如下.

class ReturnJson(APIView):

  coreapi_fields=(
    DocParam("token"),
  )
  
  @catch_exception
  def get(self, request, *args, **kwargs):
    params=get_parameter_dic(request)
    return JsonResponse(data=params)
  
  @catch_exception
  def post(self, request, *args, **kwargs):
    params=get_parameter_dic(request)
    return JsonResponse(data=params)
  
  @catch_exception
  def put(self, request, *args, **kwargs):
    params=get_parameter_dic(request)
    return JsonResponse(data=params)

日志配置

# 首先创建日志存储路径.
import logging
import django.utils.log
import logging.handlers

log_path = os.path.join(BASE_DIR, "logs")

if not os.path.exists(log_path):
  os.makedirs("logs")

# DJANGO_LOG_LEVEL=DEBUG

LOGGING = {
  'version': 1,
  'disable_existing_loggers': False,
  'formatters': {
    'verbose': {
      'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
    },
    'simple': {
      'format': '%(levelname)s %(message)s'
    },
    'standard': {
      'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(levelname)s]- %(message)s'
    },
  },
  'handlers': {
    'default': {
      'level':'DEBUG',
      'class':'logging.handlers.RotatingFileHandler',
      'filename': os.path.join(BASE_DIR,'logs','all.log'), #或者直接写路径:'c:\logs\all.log',
      'maxBytes': 1024*1024*5, # 5 MB
      'backupCount': 5,
      'formatter':'standard',
    },
    'console': {
      'level': 'DEBUG',
      'class': 'logging.StreamHandler',
      'formatter': 'standard',
    },
    'file': {
      'level':'INFO',
      'class':'logging.handlers.RotatingFileHandler',
      'filename': os.path.join(BASE_DIR, 'logs','debug.log'), #或者直接写路径:'c:\logs\all.log',
      'maxBytes': 1024*1024*5, # 5 MB
      'backupCount': 5,
      'formatter':'standard',
    },
  },
  # DEBUG(测试环境) CRITICAL(项目崩溃)  ERROR(抛出异常未被捕获) WARNING(例如403) INFO(系统表现相关)
  'loggers': {
    'print': {
      'handlers': ["file"],
      'level': 'INFO',
      'propagate': False
    },
    'ifacerecognition': {
      'handlers': ['default'],
      'level': 'ERROR',
    },
    # 'django': {
    #   'handlers': ['default'],
    #   'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
    # },
    'django.request': {
      'handlers': ['default'],
      'level': 'ERROR',
    },
  },
}

日志配置由三部分组成

1.日志格式formatters

2.日志处理方法, 例如保存到xxx.log文件或者别的什么, 甚至可以自动发送电子邮件.

3.日志器, 也就是正式的应用, 你可以获取一个log, 手动添加log内容.

一个向log文件写入内容的例子

import logging
class ReturnJson(APIView):

  coreapi_fields=(
    DocParam("token"),
  )

  @catch_exception
  def get(self, request, *args, **kwargs):
    params=get_parameter_dic(request)
    log=logging.getLogger("print")
    log.info("asdf")
    log.error("asdffff")
    return JsonResponse(data=params)

至此一个django项目所需要的组成部分基本齐全了. 剩下的工作只是业务逻辑的编写.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中操作列表之List.pop()方法的使用
May 21 Python
Python pickle模块用法实例分析
May 27 Python
python爬虫_微信公众号推送信息爬取的实例
Oct 23 Python
Python IDLE入门简介
Dec 08 Python
python实现linux下抓包并存库功能
Jul 18 Python
python在回调函数中获取返回值的方法
Feb 22 Python
python中图像通道分离与合并实例
Jan 17 Python
如何写python的配置文件
Jun 07 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
pycharm中leetcode插件使用图文详解
Dec 07 Python
pytorch 梯度NAN异常值的解决方案
Jun 05 Python
Django实现发送邮件功能
Jul 18 #Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 #Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 #Python
django页面跳转问题及注意事项
Jul 18 #Python
django框架模板语言使用方法详解
Jul 18 #Python
Django中间件基础用法详解
Jul 18 #Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 #Python
You might like
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php入门小知识
2008/03/24 PHP
PHP XML数据解析代码
2010/05/26 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
调试php程序的简单步骤
2019/10/04 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
Python 如何创建一个简单的REST接口
2020/07/30 Python
python用Configobj模块读取配置文件
2020/09/26 Python
详解python对象之间的交互
2020/09/29 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
小学生校园广播稿
2014/09/28 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
门面房租房协议书
2014/12/01 职场文书
万里长城导游词
2015/01/30 职场文书
努力工作保证书
2015/02/28 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
辩护词格式
2015/05/22 职场文书
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS