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 Mysql自动备份脚本
Jul 14 Python
Python正则表达式匹配ip地址实例
Oct 09 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
Python生成器以及应用实例解析
Feb 08 Python
Django CBV类的用法详解
Jul 26 Python
python进程间通信Queue工作过程详解
Nov 01 Python
Python集合操作方法详解
Feb 09 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
浅谈TensorFlow之稀疏张量表示
Jun 30 Python
Python 批量下载阴阳师网站壁纸
May 19 Python
Django基础CBV装饰器和中间件
Mar 22 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
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
任意位置显示html菜单
2007/02/01 Javascript
简明json介绍
2008/09/28 Javascript
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
基于JavaScript的操作系统你听说过吗?
2016/01/28 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
JS函数本身的作用域实例分析
2020/03/16 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
浅谈CSS3 box-sizing 属性 有趣的盒模型
2019/04/02 HTML / CSS
室内设计专业毕业生求职信
2014/05/02 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
诉讼授权委托书
2014/10/15 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
后备干部推荐材料
2014/12/24 职场文书
公司业务员管理制度
2015/08/05 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
python实现Nao机器人的单目测距
2021/09/04 Python