5 luffy后台项目配置(日志,全局异常,响应对象)

 

 

 

1.日志的配置

封装logger

dev.py(真实项目上线后,日志文件打印级别不能过低,因为一次日志记录就是一次文件io操作)
# 复制代码到配置文件
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': {
            # 实际开发建议使用WARNING
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            # 实际开发建议使用ERROR
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR代表的是小luffyapi
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            # 文件内容编码
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}
utils/logging.py(在项目路径下建立utils/logging.py)
import logging
logger = logging.getLogger('django')   #括号里填写日志对象

 

 

以后,在py文件中,导入使用即可

from luffy.utils.logging import logger
logger.error('报错了')

 

 

 

 

 

 配置完上面的,

 

 

 

 

2.封装项目异常处理

 drf才有异常处理,所以需要先安装pip install djangorestframework(需要注册,rest_framework,否则用Response会报错)

utils.exception.py

# 写一个函数
from rest_framework.views import exception_handler
from rest_framework.views import Response
from utils.logging import logger
def common_exception_handler(exc, context):
    # 只要进入到这个函数,就是出了异常,只要出了异常,就要记录日志
    # 日志要记录的尽量详细
    # exc:错误对象
    # context:中有请求对象,request对象,请求路径就在里面

    res = exception_handler(exc, context)

    # 也可以记录当前登录用户 context['request'].user
    path = context['request'].get_full_path()
    view_name = str(context['view'])
    logger.error('系统错误:请求地址是:%s,请求的试图类是:%s,错误原因是:%s' % (path, view_name,str(exc)))
    if res:  # 走了drf的异常
        return Response({'code': 888, 'msg': res.data['detail']})
    else:
        return Response({'code': 999, 'msg': '服务器异常,请联系系统管理员'})
settings.py
# 配置在配置文件中
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.exception.common_exception_handler',
}

# 以后,只要使用drf出的异常,都会记录日志

 

 

 

3 响应对象

# 在utils/response.py
from rest_framework.response import Response
class APIResponse(Response):
    def __init__(self, code=100, msg='成功', http_status=None, headers=None, exception=False, **kwargs):
        data = {
            'code': code,
            'msg': msg,
        }
        if kwargs:
            data.update(kwargs)
        super().__init__(data=data, status=http_status, headers=headers, exception=exception)
# 以后,响应对象,用自己的
class TestView(APIView):
def get(self, request):
return APIResponse()
APIResponse()括号内啥也不写,就是
            'code': code,
            'msg': msg,
括号内加其他东西,就会多显示其他东西

 

 

 

 

 

 

 

 

posted @ 2022-02-17 19:54  甜甜de微笑  阅读(44)  评论(0编辑  收藏  举报