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跨文件全局变量的实现方法示例
Dec 10 Python
Python程序运行原理图文解析
Feb 10 Python
Python实现简易过滤删除数字的方法小结
Jan 09 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
PyQt5 多窗口连接实例
Jun 19 Python
Python JSON编解码方式原理详解
Jan 20 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 Python
keras .h5转移动端的.tflite文件实现方式
May 25 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
Nov 11 Python
Python+Tkinter打造签名设计工具
Apr 01 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 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
深入PHP与浏览器缓存的分析
2013/06/03 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
tp5实现微信小程序多图片上传到服务器功能
2018/07/16 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
jQuery中next方法用法实例
2015/04/24 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
Python字典操作简明总结
2015/04/13 Python
python3 读取Excel表格中的数据
2018/10/16 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
Python整数对象实现原理详解
2019/07/01 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
python语言的优势是什么
2020/06/17 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
运动会入场词200字
2014/02/15 职场文书
环保项目建议书
2014/08/26 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
财务人员岗位职责
2015/02/03 职场文书
律师催款函范文
2015/06/24 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL