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 调用DLL操作抄表机
Jan 12 Python
在Python的struct模块中进行数据格式转换的方法
Jun 17 Python
Python 绘图库 Matplotlib 入门教程
Apr 19 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
深入学习python多线程与GIL
Aug 26 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
Nov 27 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 Python
Python实现删除某列中含有空值的行的示例代码
Jul 20 Python
Django 实现图片上传和下载功能
Dec 31 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会话控制实例分析
2016/12/24 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
2016/05/23 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
Python colormap库的安装和使用详情
2020/10/06 Python
python实现图片转字符画的完整代码
2021/02/21 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
初中同学聚会邀请函
2014/02/03 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
安全责任书范文
2014/08/25 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
2014年党员整改措施
2014/10/24 职场文书
介绍信如何写
2015/01/31 职场文书
护士实习自荐信
2015/03/06 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
nginx lua 操作 mysql
2022/05/15 Servers