<filename>clashroyalecampsite_sever/settings.py
"""
Django settings for clashroyalecampsite_sever project.

Generated by 'django-admin startproject' using Django 3.0.5.

For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""

import os
import sys
from datetime import timedelta
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.insert(0, BASE_DIR)  # 方便import apps和apps_extend 设置为 mark dir...
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
sys.path.insert(0, os.path.join(BASE_DIR, 'apps_extend'))  # 添加扩展应用路径(方便修改第三方App源码)

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '自己填写或者项目自动生成的key'

# SECURITY WARNING: don't run with debug turned on in production!
# DEBUG = True
# ALLOWED_HOSTS = ['x.x.x.x', 'api-development.xxx.com', 'localhost', '127.0.0.1']  # 替换成自己测试地址

DEBUG = False
ALLOWED_HOSTS = ['api-development.xxx.com', 'api.xxx.com']  # 替换成自己线上域名

AUTH_USER_MODEL = 'users.User'  # 使用自己定义模型替换Django用户模型
AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',  # 修改自定义用户验证
)

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'rest_framework.apps.RestFrameworkConfig',
    'rest_framework.authtoken',
    'rest_framework_simplejwt.token_blacklist',

    'xadmin',  # 后台管理库
    'crispy_forms',  # xadmin的依赖库
    'reversion',  # xadmin的依赖库
    'django_filters',  # 过滤器组件
    'corsheaders',  # 跨域组件
    'drf_yasg',  # 文档组件

    'users.apps.UsersConfig',
    'home.apps.HomeConfig',
]

CORS_ORIGIN_ALLOW_ALL = True  # 所有的访问都将被允许，白名单不会被使用，默认为false

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # 跨域配置
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'clashroyalecampsite_sever.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'clashroyalecampsite_sever.wsgi.application'

# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

if DEBUG:
    DATABASES = {
        'default': {
            # 'ENGINE': 'django.db.backends.sqlite3',
            # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'xxx',  # 数据库名，需要在连接之前就创建好
            'USER': 'root',
            'PASSWORD': '<PASSWORD>',  # 替换成自己设置的数据库密码
            'HOST': 'x.x.x.x',  # 替换成自己数据库ip
            'PORT': '3306',
            # 让myslq支持emoji和指定引擎，排序自己看着设置。对应mysql创建的数据库也要采用utf8mb4。特别是需要支持emoji的字段对应的表、字段也需要修改为utf8mb4。
            'OPTIONS': {'charset': 'utf8mb4', 'init_command': 'SET default_storage_engine=INNODB;'},
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'xxx',  # 数据库名,需要在连接之前就创建好
            'USER': 'root',
            'PASSWORD': '<PASSWORD>',
            'HOST': 'x.x.x.x',
            'PORT': '3306',
            'OPTIONS': {'charset': 'utf8mb4', 'init_command': 'SET default_storage_engine=INNODB;'},
            # 让myslq支持emoji和指定引擎
        }
    }

# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/

LANGUAGE_CODE = 'zh-hans'  # 'en-us'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False  # 默认是True，时间是UTC时间，改为使用本地时间，所用手动修改为False！

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

# 配置媒体文件，一般上传存放文件路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# 如果项目以图片视频为主，采用分布式FastDFS文件系统，不再使用media方式

STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static_common'), )  # 开发模式中需要用到
STATIC_ROOT = os.path.join(BASE_DIR, 'static')  # 部署的时候才会用到

# 自定义配置DRF - 全局配置
REST_FRAMEWORK = {
    # 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
    # 文档模块
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',

    # 认证模块
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',  # 基础用户认证
        'rest_framework.authentication.SessionAuthentication',
        # 'rest_framework_simplejwt.authentication.JWTAuthentication',  # 验证过程需要访问数据库，并获取到用户信息
        'rest_framework_simplejwt.authentication.JWTTokenUserAuthentication',  # 用于单点登录。不访问数据库
    ],

    # 权限模块
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticatedOrReadOnly'  # 游客只读
        # AllowAny：游客与合法用户都有所有权限
        # IsAuthenticated：游客没有任何权限，合法用户才有权限
        # IsAdminUser：游客没有任何权限，合法用户且（必须是后台管理用户is_staff是True）才有权限
        # IsAuthenticatedOrReadOnly：游客只读，合法用户有权限
    ],

    # 异常模块
    'EXCEPTION_HANDLER': 'utils.exception.exception_handler',
    # 'NON_FIELD_ERRORS_KEY': 'non_field_errors',

    # 渲染模块
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        # 'rest_framework.renderers.BrowsableAPIRenderer',
    ],

    # 解析模块
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        # 'rest_framework.parsers.FormParser',
        # 'rest_framework.parsers.MultiPartParser'
    ],
}

# 自定义配置JWT - 全局配置
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=15),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=30),
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': None,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',

    'JTI_CLAIM': 'jti',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(days=15),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=30),
}

# 配置日志系统
LOGGING = {
    'version': 1,  # 当前版本号为1，只能为1
    'disable_existing_loggers': False,  # True表示禁用logger

    # 日志记录最终是需要以什么格式文本来呈现的
    'formatters': {
        'verbose': {
            # '进程ID:{process:d} 线程ID:{thread:d}
            'format': '\n\n等级:{levelname} 时间:{asctime} 模块:{module} 文件名:{filename} 方法:{funcName} 行号:{lineno:d} '
                      '\n{message}\n\n',
            'style': '{',
        },
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },

    # 过滤器
    'filters': {
        # 'special': {
        #     '()': 'project.logging.SpecialFilter',
        #     'foo': 'bar',
        # },

        # 在debug=True不记录日志信息，需要的话就在handlers中加上这个过滤器
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },

    # 日志处理方式
    'handlers': {
        # 在控制台输出
        'console': {
            'level': 'DEBUG',  # 日志等级，只要比DEBUG高等级的信息都会被记录
            'filters': ['require_debug_true'],  # 在debug=True下才会打印在控制台
            'class': 'logging.StreamHandler',  # 使用的python的logging模块中的StreamHandler来进行输出
            'formatter': 'verbose'  # 输出格式，也可以选择简单simple
        },
        # 'file': {
        #     'level': 'INFO',
        #     'class': 'logging.handlers.RotatingFileHandler',
        #     # 日志位置，日志文件名，日志保存目录必须手动创建
        #     'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/cr.log"),  # 注意，你的文件应该有读写权限。
        #     # 日志文件的最大值，这里我们设置10M
        #     'maxBytes': 10 * 1024 * 1024,
        #     # 日志文件的数量，设置最大日志数量为10
        #     'backupCount': 10,
        #     # 日志格式：详细格式
        #     'formatter': 'verbose',
        #     'encoding': 'utf-8',  # 设置默认编码，否则打印出来汉字乱码
        # },
        # 已使用sentry
        # 'mail_admins': {
        #     'level': 'ERROR',
        #     'class': 'django.utils.log.AdminEmailHandler',
        #     'filters': ['special']
        # }
    },

    # 日志对象
    'loggers': {
        '': {
            'handlers': ['console'],  # 将来项目上线，把console去掉换成file。已使用sentry
            'level': 'DEBUG',
            'propagate': True,  # 冒泡：是否将日志信息记录冒泡给其他的日志处理系统，工作中都是True，不然django这个日志系统
                                # 捕获到日志信息之后，其他模块中可能也有日志记录功能的模块，就获取不到这个日志信息了
        },
        # 'django.request': {
        #     'handlers': ['mail_admins'],
        #     'level': 'ERROR',
        #     'propagate': False,
        # },
        # 'myproject.custom': {
        #     'handlers': ['console', 'mail_admins'],
        #     'level': 'INFO',
        #     'filters': ['special']
        # }
    }
}

# 配置sentry收集错误信息，上线时打开。如果需要使用sentry就填写自己的dsn，否则移除配置
if not DEBUG:
    sentry_sdk.init(
        dsn='https://xxxxxxxx',
        integrations=[DjangoIntegration()],

        # If you wish to associate users to errors (assuming you are using
        # django.contrib.auth) you may enable sending PII data.
        send_default_pii=True
    )

<filename>clashroyalecampsite_sever/settings.py
"""
Django settings for clashroyalecampsite_sever project.

Generated by 'django-admin startproject' using Django 3.0.5.

For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""

import os
import sys
from datetime import timedelta
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.insert(0, BASE_DIR)  # 方便import apps和apps_extend 设置为 mark dir...
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
sys.path.insert(0, os.path.join(BASE_DIR, 'apps_extend'))  # 添加扩展应用路径(方便修改第三方App源码)

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '自己填写或者项目自动生成的key'

# SECURITY WARNING: don't run with debug turned on in production!
# DEBUG = True
# ALLOWED_HOSTS = ['x.x.x.x', 'api-development.xxx.com', 'localhost', '127.0.0.1']  # 替换成自己测试地址

DEBUG = False
ALLOWED_HOSTS = ['api-development.xxx.com', 'api.xxx.com']  # 替换成自己线上域名

AUTH_USER_MODEL = 'users.User'  # 使用自己定义模型替换Django用户模型
AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',  # 修改自定义用户验证
)

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'rest_framework.apps.RestFrameworkConfig',
    'rest_framework.authtoken',
    'rest_framework_simplejwt.token_blacklist',

    'xadmin',  # 后台管理库
    'crispy_forms',  # xadmin的依赖库
    'reversion',  # xadmin的依赖库
    'django_filters',  # 过滤器组件
    'corsheaders',  # 跨域组件
    'drf_yasg',  # 文档组件

    'users.apps.UsersConfig',
    'home.apps.HomeConfig',
]

CORS_ORIGIN_ALLOW_ALL = True  # 所有的访问都将被允许，白名单不会被使用，默认为false

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # 跨域配置
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'clashroyalecampsite_sever.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'clashroyalecampsite_sever.wsgi.application'

# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

if DEBUG:
    DATABASES = {
        'default': {
            # 'ENGINE': 'django.db.backends.sqlite3',
            # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'xxx',  # 数据库名，需要在连接之前就创建好
            'USER': 'root',
            'PASSWORD': '<PASSWORD>',  # 替换成自己设置的数据库密码
            'HOST': 'x.x.x.x',  # 替换成自己数据库ip
            'PORT': '3306',
            # 让myslq支持emoji和指定引擎，排序自己看着设置。对应mysql创建的数据库也要采用utf8mb4。特别是需要支持emoji的字段对应的表、字段也需要修改为utf8mb4。
            'OPTIONS': {'charset': 'utf8mb4', 'init_command': 'SET default_storage_engine=INNODB;'},
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'xxx',  # 数据库名,需要在连接之前就创建好
            'USER': 'root',
            'PASSWORD': '<PASSWORD>',
            'HOST': 'x.x.x.x',
            'PORT': '3306',
            'OPTIONS': {'charset': 'utf8mb4', 'init_command': 'SET default_storage_engine=INNODB;'},
            # 让myslq支持emoji和指定引擎
        }
    }

# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/

LANGUAGE_CODE = 'zh-hans'  # 'en-us'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False  # 默认是True，时间是UTC时间，改为使用本地时间，所用手动修改为False！

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

# 配置媒体文件，一般上传存放文件路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# 如果项目以图片视频为主，采用分布式FastDFS文件系统，不再使用media方式

STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static_common'), )  # 开发模式中需要用到
STATIC_ROOT = os.path.join(BASE_DIR, 'static')  # 部署的时候才会用到

# 自定义配置DRF - 全局配置
REST_FRAMEWORK = {
    # 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
    # 文档模块
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',

    # 认证模块
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',  # 基础用户认证
        'rest_framework.authentication.SessionAuthentication',
        # 'rest_framework_simplejwt.authentication.JWTAuthentication',  # 验证过程需要访问数据库，并获取到用户信息
        'rest_framework_simplejwt.authentication.JWTTokenUserAuthentication',  # 用于单点登录。不访问数据库
    ],

    # 权限模块
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticatedOrReadOnly'  # 游客只读
        # AllowAny：游客与合法用户都有所有权限
        # IsAuthenticated：游客没有任何权限，合法用户才有权限
        # IsAdminUser：游客没有任何权限，合法用户且（必须是后台管理用户is_staff是True）才有权限
        # IsAuthenticatedOrReadOnly：游客只读，合法用户有权限
    ],

    # 异常模块
    'EXCEPTION_HANDLER': 'utils.exception.exception_handler',
    # 'NON_FIELD_ERRORS_KEY': 'non_field_errors',

    # 渲染模块
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        # 'rest_framework.renderers.BrowsableAPIRenderer',
    ],

    # 解析模块
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        # 'rest_framework.parsers.FormParser',
        # 'rest_framework.parsers.MultiPartParser'
    ],
}

# 自定义配置JWT - 全局配置
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=15),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=30),
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': None,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',

    'JTI_CLAIM': 'jti',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(days=15),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=30),
}

# 配置日志系统
LOGGING = {
    'version': 1,  # 当前版本号为1，只能为1
    'disable_existing_loggers': False,  # True表示禁用logger

    # 日志记录最终是需要以什么格式文本来呈现的
    'formatters': {
        'verbose': {
            # '进程ID:{process:d} 线程ID:{thread:d}
            'format': '\n\n等级:{levelname} 时间:{asctime} 模块:{module} 文件名:{filename} 方法:{funcName} 行号:{lineno:d} '
                      '\n{message}\n\n',
            'style': '{',
        },
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },

    # 过滤器
    'filters': {
        # 'special': {
        #     '()': 'project.logging.SpecialFilter',
        #     'foo': 'bar',
        # },

        # 在debug=True不记录日志信息，需要的话就在handlers中加上这个过滤器
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },

    # 日志处理方式
    'handlers': {
        # 在控制台输出
        'console': {
            'level': 'DEBUG',  # 日志等级，只要比DEBUG高等级的信息都会被记录
            'filters': ['require_debug_true'],  # 在debug=True下才会打印在控制台
            'class': 'logging.StreamHandler',  # 使用的python的logging模块中的StreamHandler来进行输出
            'formatter': 'verbose'  # 输出格式，也可以选择简单simple
        },
        # 'file': {
        #     'level': 'INFO',
        #     'class': 'logging.handlers.RotatingFileHandler',
        #     # 日志位置，日志文件名，日志保存目录必须手动创建
        #     'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/cr.log"),  # 注意，你的文件应该有读写权限。
        #     # 日志文件的最大值，这里我们设置10M
        #     'maxBytes': 10 * 1024 * 1024,
        #     # 日志文件的数量，设置最大日志数量为10
        #     'backupCount': 10,
        #     # 日志格式：详细格式
        #     'formatter': 'verbose',
        #     'encoding': 'utf-8',  # 设置默认编码，否则打印出来汉字乱码
        # },
        # 已使用sentry
        # 'mail_admins': {
        #     'level': 'ERROR',
        #     'class': 'django.utils.log.AdminEmailHandler',
        #     'filters': ['special']
        # }
    },

    # 日志对象
    'loggers': {
        '': {
            'handlers': ['console'],  # 将来项目上线，把console去掉换成file。已使用sentry
            'level': 'DEBUG',
            'propagate': True,  # 冒泡：是否将日志信息记录冒泡给其他的日志处理系统，工作中都是True，不然django这个日志系统
                                # 捕获到日志信息之后，其他模块中可能也有日志记录功能的模块，就获取不到这个日志信息了
        },
        # 'django.request': {
        #     'handlers': ['mail_admins'],
        #     'level': 'ERROR',
        #     'propagate': False,
        # },
        # 'myproject.custom': {
        #     'handlers': ['console', 'mail_admins'],
        #     'level': 'INFO',
        #     'filters': ['special']
        # }
    }
}

# 配置sentry收集错误信息，上线时打开。如果需要使用sentry就填写自己的dsn，否则移除配置
if not DEBUG:
    sentry_sdk.init(
        dsn='https://xxxxxxxx',
        integrations=[DjangoIntegration()],

        # If you wish to associate users to errors (assuming you are using
        # django.contrib.auth) you may enable sending PII data.
        send_default_pii=True
    )

Django settings for clashroyalecampsite_sever project.  Generated by 'django-admin startproject' using Django 3.0.5.  For more information on this file, see https://docs.djangoproject.com/en/3.0/topics/settings/  For the full list of settings and their values, see https://docs.djangoproject.com/en/3.0/ref/settings/ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) # 方便import apps和apps_extend 设置为 mark dir... # 添加扩展应用路径(方便修改第三方App源码) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! # SECURITY WARNING: don't run with debug turned on in production! # DEBUG = True # ALLOWED_HOSTS = ['x.x.x.x', 'api-development.xxx.com', 'localhost', '127.0.0.1']  # 替换成自己测试地址 # 替换成自己线上域名 # 使用自己定义模型替换Django用户模型 # 修改自定义用户验证 # Application definition # 后台管理库 # xadmin的依赖库 # xadmin的依赖库 # 过滤器组件 # 跨域组件 # 文档组件 # 所有的访问都将被允许，白名单不会被使用，默认为false # 跨域配置 # Database # https://docs.djangoproject.com/en/3.0/ref/settings/#databases # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # 数据库名，需要在连接之前就创建好 # 替换成自己设置的数据库密码 # 替换成自己数据库ip # 让myslq支持emoji和指定引擎，排序自己看着设置。对应mysql创建的数据库也要采用utf8mb4。特别是需要支持emoji的字段对应的表、字段也需要修改为utf8mb4。 # 数据库名,需要在连接之前就创建好 # 让myslq支持emoji和指定引擎 # Password validation # https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators # Internationalization # https://docs.djangoproject.com/en/3.0/topics/i18n/ # 'en-us' # 默认是True，时间是UTC时间，改为使用本地时间，所用手动修改为False！ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.0/howto/static-files/ # 配置媒体文件，一般上传存放文件路径 # 如果项目以图片视频为主，采用分布式FastDFS文件系统，不再使用media方式 # 开发模式中需要用到 # 部署的时候才会用到 # 自定义配置DRF - 全局配置 # 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema', # 文档模块 # 认证模块 # 基础用户认证 # 'rest_framework_simplejwt.authentication.JWTAuthentication',  # 验证过程需要访问数据库，并获取到用户信息 # 用于单点登录。不访问数据库 # 权限模块 # 游客只读 # AllowAny：游客与合法用户都有所有权限 # IsAuthenticated：游客没有任何权限，合法用户才有权限 # IsAdminUser：游客没有任何权限，合法用户且（必须是后台管理用户is_staff是True）才有权限 # IsAuthenticatedOrReadOnly：游客只读，合法用户有权限 # 异常模块 # 'NON_FIELD_ERRORS_KEY': 'non_field_errors', # 渲染模块 # 'rest_framework.renderers.BrowsableAPIRenderer', # 解析模块 # 'rest_framework.parsers.FormParser', # 'rest_framework.parsers.MultiPartParser' # 自定义配置JWT - 全局配置 # 配置日志系统 # 当前版本号为1，只能为1 # True表示禁用logger # 日志记录最终是需要以什么格式文本来呈现的 # '进程ID:{process:d} 线程ID:{thread:d} # 过滤器 # 'special': { #     '()': 'project.logging.SpecialFilter', #     'foo': 'bar', # }, # 在debug=True不记录日志信息，需要的话就在handlers中加上这个过滤器 # 日志处理方式 # 在控制台输出 # 日志等级，只要比DEBUG高等级的信息都会被记录 # 在debug=True下才会打印在控制台 # 使用的python的logging模块中的StreamHandler来进行输出 # 输出格式，也可以选择简单simple # 'file': { #     'level': 'INFO', #     'class': 'logging.handlers.RotatingFileHandler', #     # 日志位置，日志文件名，日志保存目录必须手动创建 #     'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/cr.log"),  # 注意，你的文件应该有读写权限。 #     # 日志文件的最大值，这里我们设置10M #     'maxBytes': 10 * 1024 * 1024, #     # 日志文件的数量，设置最大日志数量为10 #     'backupCount': 10, #     # 日志格式：详细格式 #     'formatter': 'verbose', #     'encoding': 'utf-8',  # 设置默认编码，否则打印出来汉字乱码 # }, # 已使用sentry # 'mail_admins': { #     'level': 'ERROR', #     'class': 'django.utils.log.AdminEmailHandler', #     'filters': ['special'] # } # 日志对象 # 将来项目上线，把console去掉换成file。已使用sentry # 冒泡：是否将日志信息记录冒泡给其他的日志处理系统，工作中都是True，不然django这个日志系统 # 捕获到日志信息之后，其他模块中可能也有日志记录功能的模块，就获取不到这个日志信息了 # 'django.request': { #     'handlers': ['mail_admins'], #     'level': 'ERROR', #     'propagate': False, # }, # 'myproject.custom': { #     'handlers': ['console', 'mail_admins'], #     'level': 'INFO', #     'filters': ['special'] # } # 配置sentry收集错误信息，上线时打开。如果需要使用sentry就填写自己的dsn，否则移除配置 # If you wish to associate users to errors (assuming you are using # django.contrib.auth) you may enable sending PII data.