zoukankan      html  css  js  c++  java
  • 4.后台项目配置

    环境变量

    dev.py
    # 环境变量操作:小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
    # 真实项目上线后,日志文件打印级别不能过低,因为一次日志记录就是一次文件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
    import logging
    logger = logging.getLogger('django')
    

    封装项目异常处理

    utils/exception.py
    from rest_framework.views import exception_handler as drf_exception_handler
    from rest_framework.views import Response
    from rest_framework import status
    from utils.logging import logger
    import logging
    logging.getLogger('django')
    def exception_handler(exc, context):
        response = drf_exception_handler(exc, context)
        if response is None:
            # 记录服务器异常
            logger.critical('%s' % exc)
            response = Response({'detail': '服务器异常,请重试...'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        return response
    
    settings.py
    REST_FRAMEWORK = {
        'EXCEPTION_HANDLER': 'utils.exception.exception_handler',
    }
    

    二次封装Response模块

    utils/response.py
    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
    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'  # 单删
    """
    
  • 相关阅读:
    sizeof和strlen的区别
    备注
    将一个正整数分解质因数
    malloc和new有什么区别
    用C来实现内存池
    句柄和指针的区别和联系是什么?
    c/c++ 宏中"#"和"##"的用法
    手机上网的原理
    数据类型转换(转自CSDN)
    vc debug和Release的切换
  • 原文地址:https://www.cnblogs.com/Ghostant/p/12512985.html
Copyright © 2011-2022 走看看