浮光商城01-服务端初始化配置

01. django日志配置

基于django开发, Django 使用 Python 内置的 logging 模块处理系统日志。

django官方日志配置文档:https://docs.djangoproject.com/zh-hans/3.2/topics/logging/

日志信息从严重程度由高到低,一共分了5个等级。

由loging模块默认提供了5个操作方法,分别可以记录以下5个等级日志的。

等级释义
CRITICAL(fatal)致命错误,程序根本跑不起来
ERROR运行错误,程序运行发生错误的地方时就会退出程序
WARNING运行警告,程序运行发生警告的地方时会显示警告提示,但是程序会继续往下执行
INFO运行提示,一般的系统信息,并非日志
DEBUG调试信息,排查故障时使用的低级别系统信息

在项目的配置文件中追加如下配置:

# 日志
LOGGING = {
    'version': 1, 
    # 使用的日志模块的版本,目前官方提供的只有版本1,但是官方有可能会升级,为了避免升级出现的版本问题,所以这里固定为1
    'disable_existing_loggers': False,  
    # 是否禁用其他的已经存在的日志功能?肯定不能,有可能有些第三方模块在调用,所以禁用了以后,第三方模块无法捕获自身出现的异常了。
    'formatters': {  
    # 日志格式设置,verbose或者simple都是自定义的
        'verbose': {  
        # 详细格式,适合用于开发人员不在场的情况下的日志记录。
            # 格式定义:https://docs.python.org/3/library/logging.html#logrecord-attributes
            # levelname 日志等级
            # asctime   发生时间
            # module    文件名
            # process   进程ID
            # thread    线程ID
            # message   异常信息
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',  # 变量格式分隔符
        },
        'simple': {  # 简单格式,适合用于开发人员在场的情况下的终端输出
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    'filters': {  # 过滤器
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {  
    # 日志处理流程,console或者mail_admins都是自定义的。
        'console': {
            'level': 'DEBUG',  # 设置当前日志处理流程中的日志最低等级
            'filters': ['require_debug_true'],  # 当前日志处理流程的日志过滤
            'class': 'logging.StreamHandler',  # 当前日志处理流程的核心类,StreamHandler可以帮我们把日志信息输出到终端下
            'formatter': 'simple'  # 当前日志处理流程的日志格式
        },
        # 'mail_admins': {
        #     'level': 'ERROR',                  # 设置当前日志处理流程中的日志最低等级
        #     'class': 'django.utils.log.AdminEmailHandler',  # AdminEmailHandler可以帮我们把日志信息输出到管理员邮箱中。
        #     'filters': ['special']             # 当前日志处理流程的日志过滤
        # }
        'file': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录logs必须手动创建
            'filename': BASE_DIR.parent / "logs/luffycity.log",
            # 单个日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 备份日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose'
        },
    },
    'loggers': {  
    # 日志处理的命名空间
        'django': {
            'handlers': ['console', 'file'],  
            # 当基于django命名空间写入日志时,调用那几个日志处理流程
            'propagate': True,  
            # 是否在django命名空间对应的日志处理流程结束以后,冒泡通知其他的日志功能。True表示允许
        },
    }
}

02. 项目异常处理

新建utils/exceptions.py用于保存异常处理的工具函数代码。

from rest_framework.views import exception_handler
from django.db import DatabaseError
from rest_framework.response import Response
from rest_framework import status

import logging
logger = logging.getLogger('django')


def custom_exception_handler(exc, context):
    """
    自定义异常处理
    :param exc: 异常类
    :param context: 抛出异常的上下文
    :return: Response响应对象
    """
    # 调用drf框架原生的异常处理方法
    response = exception_handler(exc, context)

    if response is None:
        view = context['view']
        if isinstance(exc, DatabaseError):
            # 数据库异常
            logger.error('[%s] %s' % (view, exc))
            response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

    return response

在配置文件中添加自定义异常处理的配置。

# drf配置
REST_FRAMEWORK = {
    # 自定义异常处理
    'EXCEPTION_HANDLER': 'luffycityapi.utils.exceptions.custom_exception_handler',
}

03. MySQL配置

一般在开发中,每一个项目对应一个MySQL账户和数据库,

以实现项目隔离的效果,方便管理。

利用root用户,进入MySQL,新建数据库:

create database fuguang;

创建用户:

# 8.0版本以上的mysql/MariaDB10.3
# 创建用户:create user '用户名'@'主机地址' identified by '密码';
create user 'fuguang_user'@'%' identified by 'fuguang';  # %表示任意主机都可以通过当前账户登录到mysql

# 分配权限:grant 权限选项 on 数据库名.数据表 to 'luffycity_user'@'%' with grant option;
grant all privileges on fuguang.* to 'fuguang_user'@'%' with grant option;

# mysql8.0/MariaDB10.3版本以下,创建数据库用户并设置数据库权限给当前新用户,并刷新内存中的权限记录
create user fuguang_useridentified by 'fuguang';
grant all privileges on fuguang.* to 'fuguang_user'@'%';
flush privileges;

使用pycharm连接mysql数据库。
image-20210709114342742

配置文件中添加设置:

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': BASE_DIR / 'db.sqlite3',
    # }
    'default': {
        # 'ENGINE': 'django.db.backends.mysql',  # 默认
        'ENGINE': 'dj_db_conn_pool.backends.mysql',  # 使用连接池
        'NAME': 'fuguang',  # 数据库名称
        'PORT': 3306,  # 数据库端口
        'HOST': '127.0.0.1',  # 数据库IP
        'USER': 'fuguang',  # 登录数据库的用户名称
        'PASSWORD': 'fuguang',  # 该用户密码
        'OPTIONS': {
            'charset': 'utf8mb4',  # 连接选项配置,mysql8.0以上无需配置
        },
        'POOL_OPTIONS': {  # 连接池的配置信息
            'POOL_SIZE': 10,  # 连接池默认创建的链接对象的数量
            'MAX_OVERFLOW': 10  # 连接池默认创建的链接对象的最大数量
        }
    }
}

在项目主应用下的 luffycityapi.__init__.py中导入pymysql,

如果使用的是MySQLdb(mysqlclient),不要加下面的这段代码。

import pymysql

pymysql.install_as_MySQLdb()

04. Redis配置

安装django-redis

pip install django-redis

在settings/dev.py配置中添加一下代码:

# redis configration
# 设置redis缓存
CACHES = {
    # 默认缓存
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        # 项目上线时,需要调整这里的路径
        # "LOCATION": "redis://:密码@IP地址:端口/库编号",
        "LOCATION": "redis://:123456@127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
        }
    },
    # 提供给admin运营站点的session存储
    "session": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:123456@127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
        }
    },
    # 提供存储短信验证码
    "sms_code":{
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:123456@127.0.0.1:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
        }
    }
}

# 设置用户登录admin站点时,记录登录状态的session保存到redis缓存中
SESSION_ENGINE = "django.contrib.sessions.backends.cache"

# 设置session保存的位置对应的缓存配置项
SESSION_CACHE_ALIAS = "session"

django-redis提供了get_redis_connection的方法,通过调用get_redis_connection方法传递redis的配置名称可获取到redis的连接对象,通过redis连接对象可以执行redis命令

https://redis-py.readthedocs.io/en/latest/

使用范例:

from django_redis import get_redis_connection

// 连接redis数据库
redis_conn = get_redis_connection("sms_code")

05. 测试配置

创建子应用home用来测试上面的配置,

如果没有创建子应用home,可以根据以下步骤创建。

cd fuguang_api/apps
python ../../manage.py startapp home

注册home子应用到项目分2步:

  1. 在settings/dev.py中的INSTALLED_APPS配置项里面新增home

因为项目目录的结构有所调整,我们在apps下保存了home子应用,默认是没法直接注册子应用的,

因此需要让python能直接对home进行导包识别,需要给sys.path增加一个路径成员。

settings/dev.py,代码:

# 当前项目的主应用开发目录
BASE_DIR = Path(__file__).resolve().parent.parent
# 新增apps作为导包路径,导包路径默认保存sys.path属性中,所有的python的import或者from导包语句默认都是从sys.path中记录的路径下查找模块
sys.path.insert(0, str( BASE_DIR / "apps") )
# print(sys.path)

# django3.2.9版本中,默认关闭DEBUG模式的,我们自己手动开启下,方便开发,当然如果本身是True,则无需修改。
DEBUG = True

ALLOWED_HOSTS = []


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "rest_framework", # 顺便加入 rest_framework
    "home",
]

home子应用下创建路由文件,home/urls.py,代码:

from django.urls import path
from . import views
urlpatterns = [

]

把子路由文件home/urls.py注册到总路由,luffycityapi/urls.py,代码:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('home/', include("home.urls")),
]

home/views.py,编写视图,代码:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django_redis import get_redis_connection
import logging

logger = logging.getLogger("django")


# Create your views here.
class HomeAPIView(APIView):
    def get(self, request):
        """测试代码,测试完成以后将来可以删除"""

        # 测试日志功能
        # logger.error("error信息")
        # logger.info("info信息")

        # 测试redis连接
        redis = get_redis_connection("sms_code")
        brother = redis.lrange("brother", 0, -1)

        # 测试能够捕捉异常
        # print(5 / 0)

        return Response(brother, status.HTTP_200_OK)

home/urls.py,代码:

from django.urls import path
from . import views
urlpatterns = [
    path("test", views.HomeAPIView.as_view()),
]

在终端下,利用redis-cli添加测试数据。

redis-cli
select 2
lpush brother zhangfei guanyu xiaoming 

新增关于异常类和Redis操作异常的处理代码。utils/exceptions.py,代码:

from rest_framework.views import exception_handler
from django.db import DatabaseError
from redis import RedisError
from rest_framework.response import Response
from rest_framework import status

import logging
logger = logging.getLogger('django')

def custom_exception_handler(exc, context):
    """
    自定义异常处理工具函数
    :param exc: 异常类
    :param context: 抛出异常的执行上下文
    :return: Response响应对象
    """
    # 先调用drf框架原生的异常处理方法
    response = exception_handler(exc, context)

    if response is None:
        view = context['view']
        # 判断是否发生了数据库异常
        if isinstance(exc, DatabaseError):
            # 数据库异常
            logger.error('mysql数据库异常![%s] %s' % (view, exc))
            response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

        elif isinstance(exc, RedisError):
            logger.error('redis数据库异常![%s] %s' % (view, exc))
            response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

        elif isinstance(exc, ZeroDivisionError):
            response = Response({'message': '0不能作为除数!'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    return response
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值