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, # 是否让日志信息继续冒泡给其他的日志处理系统 }, } }
2 在utils下建立log.py,实例化生成日志对象
import logging # 创造一个logger对象,使用的是配置文件中的django这个 logger = logging.getLogger('django')
3 生成的日志会自动保存在logs包下的luffy.log文件内
4 以后需要使用日志的地方,导入直接用
日志会打印到控制台和记录到文件中
from utils.logging import logger logger.info("我执行了一下")
# 全局异常捕获 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.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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通