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中字典(dict)和列表(list)的排序方法实例
Jun 16 Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
Mar 13 Python
利用pandas将numpy数组导出生成excel的实例
Jun 14 Python
python中的for循环
Sep 28 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
python实现顺时针打印矩阵
Mar 02 Python
Python版中国省市经纬度
Feb 11 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 Python
Python 实现二叉查找树的示例代码
Dec 21 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 地址栏信息的获取代码
2009/01/07 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
JavaScript 实现继承的几种方式
2021/02/19 Javascript
python获取网页状态码示例
2014/03/30 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
Python的requests网络编程包使用教程
2016/07/11 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
总经理助理的八要求
2013/11/12 职场文书
销售顾问的岗位职责
2013/11/13 职场文书
小区停车场管理制度
2014/01/27 职场文书
广告词串烧
2014/03/19 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
草房子读书笔记
2015/06/29 职场文书
教务处教学工作总结
2015/08/10 职场文书