最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

路飞项目封装logger、response以及全局异常

来源:博客园
目录
  • 一、封装日志logger
    • 1.封装日志的步骤
    • 2.测试是否封装成功
    • 3.展示测试结果
  • 二、封装全局异常处理
    • 1.封装全局异常的步骤
    • 2.写代码测试一下
    • 3.展示测试结果
  • 三、封装Response
    • 1.封装步骤
    • 2.写代码测试
    • 3.展示测试结果

一、封装日志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 logginglogger = logging.getLogger("django")

第三步:以后使用,在任何文件中导入使用即可

from utils.commom_looger import loggerlogger.info("info级别的日志")logger.error("error级别的日志")

2.测试是否封装成功

写代码测试一下

点击查看代码
# 视图函数from django.http import JsonResponsefrom luffy_api.utils.common_logger import loggerdef test_logger(request):    logger.info("info级别的日志")    logger.error("error级别的日志")    return JsonResponse({"name": "mire"})# 路由from django.urls import pathfrom user import viewsurlpatterns = [    path("test_logger/", views.test_logger),]

3.展示测试结果

后台控制台打印的信息前端渲染的信息如下

二、封装全局异常处理

前端要接收的格式需要统一,无论后端是否出错,三大认证,视图类的方法中只要出了异常,就会执行一个函数,但是这个函数只能处理drf的异常---》我们需要自己写个函数,既能处理drf异常,又能处理django异常,这样统一返回格式,前端看到格式都统一了

1.封装全局异常的步骤

第一步:在utils目录下新建common_exceptions.py文件并写函数

# 首先异常处理依赖drf,因此需要drfpip install djangorestframework# 再在common_exceptions.py文件里写函数from rest_framework.views import exception_handler as drf_exception_handlerfrom rest_framework.response import Responsefrom utils.common_logger import loggerdef 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 APIViewfrom rest_framework.response import Responseclass TestException(APIView):    def get(self, request):        l = [1, 23, 4]        print(l[9])        return Response("ok")# 路由from django.contrib import adminfrom django.urls import pathfrom user import viewsurlpatterns = [    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.写代码测试

点击查看代码
# 视图函数# 测试封装Responsefrom utils.common_response import APIResponseclass TestAPIResponse(APIView):    def get(self, request):        return APIResponse({"code":100, "msg":"成功"})from django.contrib import adminfrom django.urls import pathfrom user import viewsurlpatterns = [    path("admin/", admin.site.urls),    path("test_response/", views.TestAPIResponse.as_view()),]

3.展示测试结果

关键词: 测试结果 异常处理 点击查看