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使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
python安装教程
Feb 28 Python
Jupyter notebook远程访问服务器的方法
May 24 Python
python实现文件的备份流程详解
Jun 18 Python
python交易记录整合交易类详解
Jul 03 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
python os.fork() 循环输出方法
Aug 08 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
python 逐步回归算法
Apr 06 Python
在 Python 中利用 Pool 进行多线程
Apr 24 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/01 无线电
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
Python中使用支持向量机(SVM)算法
2017/12/26 Python
python如何实现内容写在图片上
2018/03/23 Python
python爬虫实例详解
2018/06/19 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
环境科学专业大学生自荐信格式
2013/09/21 职场文书
玲玲的画教学反思
2014/02/04 职场文书
《理想》教学反思
2014/02/17 职场文书
暖通工程师岗位职责
2014/06/12 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书