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基础教程之python消息摘要算法使用示例
Feb 10 Python
python获取文件后缀名及批量更新目录下文件后缀名的方法
Nov 11 Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
使用Python对Csv文件操作实例代码
May 12 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
python中将zip压缩包转为gz.tar的方法
Oct 18 Python
python3爬虫获取html内容及各属性值的方法
Dec 17 Python
在Sublime Editor中配置Python环境的详细教程
May 03 Python
Python性能测试工具Locust安装及使用
Dec 01 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 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/09/09 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
this[] 指的是什么内容 讨论
2007/03/24 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
BootStrapValidator校验方式
2016/12/19 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
详解在Python程序中自定义异常的方法
2015/10/16 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
Django使用rest_framework写出API
2020/05/21 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
护理自我鉴定范文
2013/10/06 职场文书
计算机专业大学生的自我评价
2013/11/14 职场文书
环境科学毕业生自荐信
2013/11/21 职场文书
营销人才自我鉴定范文
2013/12/25 职场文书
迎元旦广播稿
2014/02/22 职场文书
高中生操行评语
2014/04/25 职场文书
mybatis 获取更新记录的id
2022/05/20 Java/Android