zoukankan      html  css  js  c++  java
  • 环境变量,封装logger,封装项目异常处理,二次封装Response模块,路由组件配置

    环境变量

    dev.py
    1
    2
    3
    4
    5
    # 环境变量操作:小luffyapiBASE_DIR与apps文件夹都要添加到环境变量
    import sys
    sys.path.insert(0, BASE_DIR)
    APPS_DIR = os.path.join(BASE_DIR, 'apps')
    sys.path.insert(1, APPS_DIR)
    在写项目直接导入utils文件夹也不’’错误提示’’

    封装logger

    dev.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    # 真实项目上线后,日志文件打印级别不能过低,因为一次日志记录就是一次文件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/logging.py
    1
    2
    import logging
    logger = logging.getLogger('django')

    封装项目异常处理

    utils/exception.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def common_exception_handler(exc, context):
    response = exception_handler(exc, context)
    # 记录异常日志
    logger.error('异常视图为%s,异常原因为%s' %(context['view'].__class__.__name__,str(exc)))
    if response is None:
    return APIResponse(msg='error',data=str(exc))
    else:
    return APIResponse(msg='error',data=response.data)


     
    settings.py
    1
    2
    3
    REST_FRAMEWORK = {
      'EXCEPTION_HANDLER': 'luffyapi.utils.exception.common_exception_handler',

    }

    二次封装Response模块

    utils/response.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from rest_framework.response import Response

    class APIResponse(Response):
    def __init__(self, status=0, msg='ok', http_status=None, headers=None, exception=False, **kwargs):
    data = {
    'status': status,
    'msg': msg,
    }
    if kwargs:
    data.update(kwargs)
    super().__init__(data=data, status=http_status, headers=headers, exception=exception)

    路由组件配置

    utils/router.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    from rest_framework.routers import Route, DynamicRoute, SimpleRouter as DRFSimpleRouter

    class SimpleRouter(DRFSimpleRouter):
    routes = [
    # List route. /资源s/
    Route(
    url=r'^{prefix}{trailing_slash}$',
    mapping={
    'get': 'list', # 群查
    'post': 'create', # 单增、群增
    'put': 'multiple_update', # 群整改
    'patch': 'multiple_partial_update', # 群局改
    'delete': 'multiple_destroy', # 群删
    },
    name='{basename}-list',
    detail=False,
    initkwargs={'suffix': 'List'}
    ),
    # Dynamically generated list routes. Generated using
    # @action(detail=False) decorator on methods of the viewset.
    DynamicRoute(
    url=r'^{prefix}/{url_path}{trailing_slash}$',
    name='{basename}-{url_name}',
    detail=False,
    initkwargs={}
    ),
    # Detail route. /资源s/(pk)/
    Route(
    url=r'^{prefix}/{lookup}{trailing_slash}$',
    mapping={
    'get': 'retrieve', # 单查
    'put': 'update', # 单整改
    'patch': 'partial_update', # 单局改
    'delete': 'destroy'# 单删
    },
    name='{basename}-detail',
    detail=True,
    initkwargs={'suffix': 'Instance'}
    ),
    # Dynamically generated detail routes. Generated using
    # @action(detail=True) decorator on methods of the viewset.
    DynamicRoute(
    url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$',
    name='{basename}-{url_name}',
    detail=True,
    initkwargs={}
    ),
    ]

    # 对外提供十大接口的router对象
    router = SimpleRouter()
    # eg: router.register('users', UserModelViewSet, basename='user')
    """
    /users/
    'get': 'list', # 群查
    'post': 'create', # 单增、群增
    'put': 'multiple_update', # 群整改
    'patch': 'multiple_partial_update', # 群局改
    'delete': 'multiple_destroy', # 群删

    /users/(pk)/
    'get': 'retrieve', # 单查
    'put': 'update', # 单整改
    'patch': 'partial_update', # 单局改
    'delete': 'destroy' # 单删
    """
  • 相关阅读:
    NSIndexPath 延伸
    iOS进阶推荐的书目
    配置App真机测试证书的流程 一览
    NSAttributedString 的21种属性 详解
    KVO & 通知 小记
    贝塞尔曲线 & CAShapeLayer & Stroke 动画 浅谈
    提升开发人员修为的探讨
    热门IOS 第三方库
    drawRect & 内存 -> 深究
    CALayer & UIView 关系浅析
  • 原文地址:https://www.cnblogs.com/plyc/p/14084247.html
Copyright © 2011-2022 走看看