drf自定义公共组件

一、response.py

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)
View Code

 二、loggers.py

  1、settings.py:

# 日志

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,
        },
    }
}
View Code

  2、配置:

import logging

# 对应配置中loggers的键
common_logger = logging.getLogger('logger_1')

# 使用
# common_logger.error('日志内容')
View Code

 三、exception.py

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)
View Code

  

原文地址:https://www.cnblogs.com/caoyu080202201/p/13332223.html