05、 项目后台配置(日志、异常、模块导出、二次封装Response)

1、配置日志

1 在配置文件dev中加入日志配置

复制代码
# 日志相关
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': 'INFO',
            '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,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}
View Code
复制代码

2 在utils下建立log.py,实例化生成日志对象

import logging

# 创造一个logger对象,使用的是配置文件中的django这个
logger = logging.getLogger('django')

3 生成的日志会自动保存在logs包下的luffy.log文件内

4 以后需要使用日志的地方,导入直接用

日志会打印到控制台和记录到文件中

from utils.logging import logger
logger.info("我执行了一下")

2、 处理全局异常

utils中新建excepiton.py

复制代码
# 全局异常捕获

from rest_framework.views import exception_handler  # 默认没有配置,出了异常会走它
from rest_framework.response import Response
from utils.log import logger


def common_exception_handler(exc, context):
    res = exception_handler(exc, context)
    if res:
        res = Response(data={'code': 998, 'msg': res.data.get('detail', '服务器异常,请联系系统管理员')})
    else:
        res = Response(data={'code': 999, 'msg': str(exc)})
    request = context.get('request')
    view = context.get('view')
    # 把错误信息添加进日志
    logger.error('错误原因:%s,错误视图类:%s,请求地址:%s,请求方式:%s' % (str(exc), str(view), request.path, request.method))
    return res
复制代码

dev中加入配置

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.exception.common_exception_handler'  # 再出异常,会执行这个函数
}

3、 导出模块到requirements.txt

复制代码
# 显示所有第三方模块
pip list

# 打印所有第三方模块(包括版本号)到终端
pip freeze

# 把所有第三方模块(包括版本号)导出到requirements.txt文件中
pip freeze > requirements.txt

# 可以在新的虚拟环境中把requirements.txt文件中所有模块装上
pip3 install -r requirements.txt
复制代码

 4、 Response二次封装

为什么要二次封装Response

Response是drf基于django的view封装的一个响应类,有自己的类属性和方法:

response.data     # 写在响应体中,返回给前端的数据

response.status   # 响应状态码

response.header   # 响应头

但在实际中,需要一个符合我们项目的响应格式

所以,我们要二次封装Response,写一个我们自己的响应类

utils中新建response.py

复制代码
from rest_framework.response import Response


class APIResponse(Response):
    def __init__(self, status=100, msg='ok', http_status=None, template_name=None, headers=None, content_type=None,
                 exception=False, **kwargs):
        data = {
            'status': status,
            'msg': msg,
        }
        if kwargs:
            data.update(kwargs)
        super().__init__(data=data, status=http_status, template_name=template_name, headers=headers,
                         content_type=content_type, exception=exception)
复制代码

 


 

posted @   三三得九86  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示