路飞项目封装loggerresponse以及全局异常

Posted almira998

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了路飞项目封装loggerresponse以及全局异常相关的知识,希望对你有一定的参考价值。

一、封装日志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()),
]

3.展示测试结果

以上是关于路飞项目封装loggerresponse以及全局异常的主要内容,如果未能解决你的问题,请参考以下文章

路飞项目准备

路飞项目背景,contentType以及django缓存

路飞项目,文件存储,搜索导航栏,搜索接口,搜索页面,支付宝字符介绍,支付宝二次封装,订单表设计,下单接口,前端支付页面,支付成功回调接口

路飞-项目上线

87 全局和局部组件, 子父和父子之间的通信 混入 插槽 路飞导航栏

异 常