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 相关文章推荐
Django的数据模型访问多对多键值的方法
Jul 21 Python
Python表示矩阵的方法分析
May 26 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
python中的常量和变量代码详解
Jul 25 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
如何在scrapy中集成selenium爬取网页的方法
Nov 18 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 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 301转向实现代码
2008/09/18 PHP
动态刷新 dorado树的js代码
2009/06/12 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
js实现的切换面板实例代码
2013/06/17 Javascript
基于javascript实现图片预加载
2016/01/05 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
Angular.js之作用域scope'@','=','&'实例详解
2017/02/28 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
从零学python系列之从文件读取和保存数据
2014/05/23 Python
Python自动登录126邮箱的方法
2015/07/10 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
python实现图像识别功能
2018/01/29 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
Python Selenium库的基本使用教程
2021/01/04 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
如何进行Linux分区优化
2013/02/12 面试题
在职研究生自我鉴定
2013/10/16 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
研修心得体会
2014/09/04 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
公司新员工欢迎词
2015/09/30 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
Python 线程池模块之多线程操作代码
2021/05/20 Python
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
数据设计之权限的实现
2022/08/05 MySQL