路飞项目后端>>>:封装logger、response以及全局异常
目录
一、封装日志logger
以后项目肯定要记录日志,日志都可以打印到控制台、日志可以写到日志文件中、日志存到某个库中、所有项目日志统一管理、sentry可以做统一管理日志(Django写的开源项目)。以后,在项目中不要出现print了,以后都用日志logger》Info(),等到项目上线,只要调整日志级别,低级别的日志就不用打印了,于是日志输出不用删掉
1.封装日志的步骤
第一步:在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': '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, # 是否让日志信息继续冒泡给其他的日志处理系统
},
}
}
第二步:在utils目录下新建common_logger.py文件
得到日志对象
import logging
logger = logging.getLogger('django')
第三步:以后使用,在任何文件中导入使用即可
from utils.commom_looger import logger
logger.info('info级别的日志')
logger.error('error级别的日志')
2.测试是否封装成功
写代码测试一下
点击查看代码
# 视图函数
from django.http import JsonResponse
from luffy_api.utils.common_logger import logger
def test_logger(request):
logger.info('info级别的日志')
logger.error('error级别的日志')
return JsonResponse({'name': 'mire'})
# 路由
from django.urls import path
from user import views
urlpatterns = [
path('test_logger/', views.test_logger),
]
3.展示测试结果
后台控制台打印的信息
前端渲染的信息如下
二、封装全局异常处理
前端要接收的格式需要统一,无论后端是否出错,三大认证,视图类的方法中只要出了异常,就会执行一个函数,但是这个函数只能处理drf的异常---》我们需要自己写个函数,既能处理drf异常,又能处理django异常,这样统一返回格式,前端看到格式都统一了
1.封装全局异常的步骤
第一步:在utils目录下新建common_exceptions.py文件并写函数
# 首先异常处理依赖drf,因此需要drf
pip install djangorestframework
# 再在common_exceptions.py文件里写函数
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from utils.common_logger import logger
def exception_handler(exc, context):
"""
记录日志 :那个IP地址
用户id是多少、访问那个路径
执行了那个视图函数、 出来什么错
"""
request = context.get('request')
view = context.get('view')
ip = request.META.get('REMOTE_ADDR')
user_id = request.user.pk
path = request.get_full_path()
response = drf_exception_handler(exc, context)
if response:
logger.warning('drf出来异常,异常是:%s' % str(exc))
res = Response({'code': 999, 'msg': response.data.get('detail', '服务器异常, 请联系管理员')})
else:
logger.error('用户【%s】,ip地址为【%s】,访问地址【%s】,执行的视图函数为【%s】是,出现的错是【%s】' % (user_id, ip, path, str(view), str(exc)))
res = Response({'code': 888, 'msg': '服务器异常,请联系管理员'})
return res
第二步:在配置文件里写下一下配置
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
}
# 还得注册一下
INSTALLED_APPS = [
'rest_framework',
]
2.写代码测试一下
点击查看代码
# 视图函数
# 测试全局异常配置
from rest_framework.views import APIView
from rest_framework.response import Response
class TestException(APIView):
def get(self, request):
l = [1, 23, 4]
print(l[9])
return Response('ok')
# 路由
from django.contrib import admin
from django.urls import path
from user import views
urlpatterns = [
path('admin/', admin.site.urls),
path('test_exception/', views.TestException.as_view()),
]
3.展示测试结果
三、封装Response
本身drf有Response,但是咱们公司规定,前端收到的格式都是固定的,对Response进行封装,封装后,code,msg可以不传,不传就用默认的
{code:100,msg:提示,data:{}/[]}
{code:100,msg:提示,token:asdfasd,user:lqz}
1.封装步骤
第一步:在utils下新建common_response.py、且封装APIResponse
第二步:导入使用,视图函数的方法,返回时,都使用咱们自己的
2.写代码测试
点击查看代码
# 视图函数
# 测试封装Response
from utils.common_response import APIResponse
class TestAPIResponse(APIView):
def get(self, request):
return APIResponse({'code':100, 'msg':'成功'})
from django.contrib import admin
from django.urls import path
from user import views
urlpatterns = [
path('admin/', admin.site.urls),
path('test_response/', views.TestAPIResponse.as_view()),
]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)