一、response.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from rest_framework.response import Response class CommonResponse(Response): def __init__(self, state=1, tip='响应成功', data=None, status=None, template_name=None, headers=None, exception=False, content_type=None, **kwargs): new_data = { 'state': state, 'tip': tip } new_data.update(kwargs) if data: new_data['data'] = data super().__init__(data=new_data, status=None, template_name=None, headers=None, exception=False, content_type=None)
二、loggers.py
1、settings.py:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 日志 LOGGING = { 'version': 1, 'disable_existing_loggers': False, # 可选日志格式 'formatters': { 'verbose': { 'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s' }, 'simple': { 'format': '%(levelname)s %(module)s %(lineno)d %(message)s' }, }, # 可选日志过滤级别 'filters': { 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, # 日志生成器 'handlers': { # 打印到控制台的配置 'console': { 'level': 'WARNING', 'filters': ['require_debug_true'], 'class': 'logging.StreamHandler', 'formatter': 'simple' }, # 记录到文件的配置 'file': { 'level': 'ERROR', # 日志文件会轮转保存 'class': 'logging.handlers.RotatingFileHandler', # 日志文件路径 'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"), # 日志文件大小上限,这里代表300Mb,超过上限会开新文件 'maxBytes': 300 * 1024 * 1024, # 日志文件的数量上限,这里代表10个,超过上限会自动删除最早的 'backupCount': 10, 'formatter': 'verbose', 'encoding': 'utf-8' }, }, # 可选日志对象 'loggers': { 'logger_1': { 'handlers': ['console', 'file'], # 是否让日志信息继续冒泡给其他的日志处理系统 'propagate': True, }, } }
2、配置:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import logging # 对应配置中loggers的键 common_logger = logging.getLogger('logger_1') # 使用 # common_logger.error('日志内容')
三、exception.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from rest_framework.views import exception_handler from .response import CommonResponse from .loggers import common_logger # exc: 异常对象 # context: 其他异常属性 def common_exception_handler(exc, context): # 组织异常信息 # context中取出发生异常的视图类的对象,进而得到类名 msg = '来自<{}>的异常:<{}>'.format(context.get('view').__class__.__name__, str(exc)) # 生成异常日志记录到文件 common_logger.error(msg) # 先执行默认异常方法,得到response对象 rep_obj = exception_handler(exc, context) # 没有返回,说明异常未被处理 if not rep_obj: return CommonResponse(state=0, tip='未分类异常', error=msg) # 重新组织默认异常的返回格式 else: return CommonResponse(state=0, tip='已知异常', error=rep_obj.data)