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,
括号内加其他东西,就会多显示其他东西