首页 > 其他分享 >路飞-准备/日志/全局异常封装/封装Response

路飞-准备/日志/全局异常封装/封装Response

时间:2023-02-27 20:25:35浏览次数:36  
标签:logger 封装 utils 路飞 code import 日志 Response

项目准备

1.创建虚拟环境
2.用新的虚拟环境来创建项目
3.修改django项目目录


├── luffyapi
	├── logs/				# 项目运行时/开发时日志目录 - 包
    ├── luffyapi/      		# 项目主应用,开发时的代码保存 - 包
     	├── apps/      		# 开发者的代码保存目录,以模块[子应用]为目录保存 - 包
          ├── 相关的app
      ├── libs/      		# 第三方类库的保存目录[第三方组件、模块] - 包
    	├── settings/  		# 配置目录
					├── dev.py   	# 项目开发时的本地配置
					└── prod.py  	# 项目上线时的运行配置
			├── urls.py    		# 总路由
			└── utils/     		# 多个模块[子应用]的公共函数类库[自己开发的组件]
  └── scripts/       		# 保存项目运营时的脚本文件 - 文件夹
  ├── manage.py			# 脚本文件

image

修改配置文件地址

image

把项目路径添加入环境变量
把创建的app注册到djangoapp中

后台日志封装 日志记录文件

1,在配置文件中 加入日志配置 --sttings文件夹dev.py配合文件中

import os
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': 'INFO',
            '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': 200 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            # 文件内容编码
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}

2.在utils文件下新建common_logger.py 得到日志对象

import logging
logger = logging.getLogger('django')

3.在任意需要记录日志的地方 调用日志对象

from LufeiApi.utils.common_logger import logger

def text(request):
    logger.info('info级别')
    logger.error('error级别')
    return JsonResponse({'111': '222'})

全局异常处理封装

前端 要接收的格式,要统一,无论后端是否出错

需要自己写一个函数,既可以处理drf异常还有django异常,统一返回格式

1.在utils文件中新建 common_exceptions.py 编写处理错误的统一返回方法

from rest_framework.views import exception_handler
from LufeiApi.utils.common_logger import logger
from rest_framework.response import Response
from LufeiApi.utils import code_type


# 只要代码运行带这个函数中 一定是出现异常了
def my_exception_handler(exc, context):
    request = context.get('request')
    # 获取用户对象
    ip = request.META.get('REMOTE_ADDR')
    id = request.user.pk
    view = context.get('view')
    path = request.get_full_path()

    response = exception_handler(exc, context)
    if response:
        logger.warning(f'用户id:{id},ip:{ip},错误信息:{exc}')
        # drf里面主动抛的异常 目前设置是warning级别
        res = Response({'code': code_type.DRF_ERROR, 'msg': response.data.get('detail', '服务器异常,请联系管理员')})
    else:
        # django运行程序发送的异常  error 级别
        logger.error(f'用户id:{id},ip:{ip},视图函数:{view} ,路径:{path} 错误信息:{exc}')
        res = Response({'code': code_type.DJANGO_ERROR, 'msg': '服务器异常,请联系管理员'})
    return res

2.在配置文件中 dev.py中

配置配置文件,以后只要出了异常,都会走咱们的函数
    	REST_FRAMEWORK = {
            'EXCEPTION_HANDLER': 'utils.common_exceptions.my_exception_handler',
        }
  勇敢大胆写代码,即便报错,程序不会蹦,并且会记录日志,并且处理成统一格式

封装Response

由于返回给前端的格式是固定的,所以需要封装然后统一返回

封装步骤1: 在utils文件夹中新建 common_response.py

2.封装APIResponse

eg:{code:'100',msg:'成功',data:[{},{}]}


from rest_framework.response import Response


class MyResponse(Response):
    def __init__(self, code=100, msg='成功', status=None, headers=None, **kwargs):
        data = {'code': code, 'msg': msg}
        if kwargs:
            data.update(kwargs)
           # 两个字典合并,把接收到的额外关键词传参处理
        super().__init__(data=data, status=status, headers=headers)

        
 # 根据公司规定可以去自定义个返回的样式

3.在视图函数中使用

from rest_framework.views import APIView
from LufeiApi.utils.common_response import MyResponse


class Text1(APIView):
    def get(self, request):
        return MyResponse(data=[{'111':'222'},{'111':'222'}])
        return MyResponse(token='1123123',username='2222')
# 这样就封装了 返回的函数 通过参数即可控制

标签:logger,封装,utils,路飞,code,import,日志,Response
From: https://www.cnblogs.com/moongodnnn/p/17161713.html

相关文章