375 lines
12 KiB
Python
375 lines
12 KiB
Python
# application/settings.py
|
||
|
||
"""
|
||
Django项目配置文件
|
||
=============================================================
|
||
|
||
Django settings for application project.
|
||
Generated by 'django-admin startproject' using Django 3.2.3.
|
||
|
||
该文件包含项目的所有配置项,包括:
|
||
- 基础路径配置
|
||
- 安全配置(密钥、调试模式、跨域等)
|
||
- 应用注册
|
||
- 中间件配置
|
||
- 数据库配置
|
||
- 静态文件配置
|
||
- 验证码配置等
|
||
|
||
For more information on this file, see
|
||
https://docs.djangoproject.com/en/3.2/topics/settings/
|
||
|
||
For the full list of settings and their values, see
|
||
https://docs.djangoproject.com/en/3.2/ref/settings/
|
||
"""
|
||
|
||
import os.path
|
||
import socket
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
# 预先加载配置文件,切记此处不可删除
|
||
# 该导入用于加载 .env 环境变量文件
|
||
from extends.extends_dotenv import env_path
|
||
|
||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||
from config import env
|
||
from config.env import *
|
||
|
||
# 设置默认编码
|
||
if sys.platform == 'win32':
|
||
import locale
|
||
|
||
# 设置控制台编码
|
||
if sys.stdout.encoding != 'utf-8':
|
||
sys.stdout.reconfigure(encoding='utf-8')
|
||
if sys.stderr.encoding != 'utf-8':
|
||
sys.stderr.reconfigure(encoding='utf-8')
|
||
|
||
# 设置环境变量
|
||
os.environ['PYTHONIOENCODING'] = 'utf-8'
|
||
os.environ['PYTHONUTF8'] = '1'
|
||
|
||
# ==================== 项目基础路径配置 ====================
|
||
|
||
# 项目根目录路径
|
||
# 获取当前文件所在目录的父目录(即项目根目录)
|
||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||
|
||
# 自定义Python模块搜索路径
|
||
# 将项目根目录和apps目录添加到系统路径,便于导入模块
|
||
sys.path.insert(0, BASE_DIR) # 添加项目根目录
|
||
sys.path.insert(1, os.path.join(BASE_DIR, 'apps')) # 添加apps应用目录
|
||
|
||
# ==================== 安全配置 ====================
|
||
# Quick-start development settings - unsuitable for production
|
||
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
|
||
|
||
# SECURITY WARNING: keep the secret key used in production secret!
|
||
# 项目密钥,用于加密session、CSRF等,生产环境必须修改为复杂字符串
|
||
SECRET_KEY = 'django-insecure-!kjxf&e0pn4nrl%0&9sqp7n!ld)(gtw7v@i3fwf3sqcsh4ymat'
|
||
|
||
# SECURITY WARNING: don't run with debug turned on in production!
|
||
# 调试模式开关:True-开启详细错误页面,False-生产环境必须关闭
|
||
DEBUG = True
|
||
|
||
# ==================== 跨域处理配置 ====================
|
||
# 以下配置用于解决前后端分离时的跨域访问问题
|
||
|
||
# 是否允许跨域请求携带凭证(如cookies)
|
||
CORS_ALLOW_CREDENTIALS = True
|
||
|
||
# 是否允许所有域名跨域访问(开发环境使用,生产环境建议限制)
|
||
CORS_ORIGIN_ALLOW_ALL = True
|
||
|
||
# 允许跨域的白名单域名(注释掉的示例)
|
||
# CORS_ORIGIN_WHITELIST = (
|
||
# 'http://127.0.0.1:8080',
|
||
# )
|
||
|
||
# 允许跨域的正则表达式匹配规则
|
||
# 匹配所有http开头的域名
|
||
CORS_ALLOWED_ORIGINS_REGEXES = [
|
||
r'^http://.*?$',
|
||
]
|
||
|
||
# 注释掉的跨域域名白名单正则配置
|
||
# CORS_ORIGIN_REGEXES_WHITELIST = (
|
||
# r'^http://.*?$',
|
||
# )
|
||
|
||
# 允许跨域的HTTP请求方法
|
||
CORS_ALLOW_METHODS = (
|
||
'DELETE',
|
||
'GET',
|
||
'OPTIONS',
|
||
'PATCH',
|
||
'POST',
|
||
'PUT',
|
||
'VIEW',
|
||
)
|
||
|
||
# 允许跨域的HTTP请求头
|
||
CORS_ALLOW_HEADERS = (
|
||
'XMLHttpRequest',
|
||
'X_FILENAME',
|
||
'accept-encoding',
|
||
'authorization', # 授权头,用于JWT认证
|
||
'content-type', # 内容类型
|
||
'dnt', # Do Not Track
|
||
'origin', # 源地址
|
||
'user-agent', # 用户代理
|
||
'x-csrftoken', # CSRF令牌
|
||
'x-requested-with', # 异步请求标识
|
||
'Pragma', # 缓存控制
|
||
)
|
||
|
||
# ==================== 主机访问配置 ====================
|
||
|
||
# 允许访问的主机列表
|
||
# 使用*通配符默认所有IP均可,生产环境建议限制为具体域名
|
||
ALLOWED_HOSTS = ['*']
|
||
|
||
# 是否开启URL末尾斜杠自动补充
|
||
# True: 访问/url时会自动重定向到/url/
|
||
APPEND_SLASH = True
|
||
|
||
# ==================== 应用注册配置 ====================
|
||
# Application definition
|
||
|
||
INSTALLED_APPS = [
|
||
# 第三方应用
|
||
'corsheaders', # 跨域处理应用
|
||
'rest_framework', # Django REST Framework
|
||
'captcha', # 验证码应用
|
||
|
||
# Django内置应用
|
||
'django.contrib.admin', # 管理后台
|
||
'django.contrib.auth', # 认证系统
|
||
'django.contrib.contenttypes', # 内容类型框架
|
||
'django.contrib.sessions', # 会话框架
|
||
'django.contrib.messages', # 消息框架
|
||
'django.contrib.staticfiles', # 静态文件管理
|
||
|
||
# 扩展应用
|
||
'application', # 主应用
|
||
|
||
# 业务子应用(按模块划分)
|
||
'application.login', # 登录模块
|
||
'application.level', # 职级管理
|
||
'application.position', # 岗位管理
|
||
'application.dept', # 部门管理
|
||
'application.role', # 角色管理
|
||
'application.role_menu', # 角色菜单关联
|
||
'application.city', # 城市管理
|
||
'application.link', # 友情链接
|
||
'application.notice', # 公告管理
|
||
'application.user', # 用户管理
|
||
'application.user_role', # 用户角色关联
|
||
'application.dict', # 字典管理
|
||
'application.dict_item', # 字典项管理
|
||
'application.config', # 配置管理
|
||
'application.config_item', # 配置项管理
|
||
'application.param', # 参数管理
|
||
'application.file_template', # 文件模板管理
|
||
'application.menu', # 菜单管理
|
||
'application.config_web', # Web配置
|
||
'application.upload', # 文件上传
|
||
'application.generator', # 代码生成器
|
||
'application.job', # 定时任务
|
||
'application.job_log', # 任务日志
|
||
'application.login_log', # 登录日志
|
||
'application.operation_log', # 操作日志
|
||
'application.category', # 文章分类
|
||
'application.article', # 文章管理
|
||
'application.example', # 案例管理
|
||
]
|
||
|
||
# ==================== 中间件配置 ====================
|
||
|
||
MIDDLEWARE = [
|
||
# 跨域处理中间件(必须放在最前面)
|
||
'corsheaders.middleware.CorsMiddleware',
|
||
'django.middleware.security.SecurityMiddleware',
|
||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||
'django.middleware.common.CommonMiddleware',
|
||
# CSRF中间件已注释,使用JWT进行认证
|
||
# 'django.middleware.csrf.CsrfViewMiddleware',
|
||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||
'django.contrib.messages.middleware.MessageMiddleware',
|
||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||
]
|
||
|
||
# 此配置用于解决弹窗被浏览器劫持问题
|
||
# SAMEORIGIN: 只允许同源页面嵌入iframe
|
||
X_FRAME_OPTIONS = 'SAMEORIGIN'
|
||
|
||
# ==================== URL路由配置 ====================
|
||
|
||
# 根URL配置模块路径
|
||
ROOT_URLCONF = 'application.urls'
|
||
|
||
# ==================== 模板配置 ====================
|
||
|
||
TEMPLATES = [
|
||
{
|
||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||
# 模板文件搜索路径
|
||
'DIRS': [os.path.join(BASE_DIR, "templates")],
|
||
'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',
|
||
],
|
||
'libraries': { # 模板标签库配置
|
||
},
|
||
},
|
||
},
|
||
]
|
||
|
||
# ==================== WSGI应用配置 ====================
|
||
|
||
WSGI_APPLICATION = 'application.wsgi.application'
|
||
|
||
# ==================== 数据库配置 ====================
|
||
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
|
||
|
||
DATABASES = {
|
||
# 默认数据库配置(从环境变量读取)
|
||
# SQLite配置(注释掉,留作备用)
|
||
# 'default': {
|
||
# 'ENGINE': 'django.db.backends.sqlite3',
|
||
# 'NAME': BASE_DIR / 'db.sqlite3',
|
||
# }
|
||
"default": {
|
||
"ENGINE": env.DATABASE_ENGINE, # 数据库引擎
|
||
"NAME": env.DATABASE_NAME, # 数据库名称
|
||
"USER": env.DATABASE_USER, # 数据库用户名
|
||
"PASSWORD": env.DATABASE_PASSWORD, # 数据库密码
|
||
"HOST": env.DATABASE_HOST, # 数据库主机地址
|
||
"PORT": env.DATABASE_PORT, # 数据库端口
|
||
}
|
||
}
|
||
|
||
# ==================== 缓存配置(Redis) ====================
|
||
# 使用 Redis 作为缓存后端,用于存储 JWT Token 黑名单等
|
||
CACHES = {
|
||
"default": {
|
||
"BACKEND": "django_redis.cache.RedisCache",
|
||
"LOCATION": f"redis://{env.REDIS_HOST}:{env.REDIS_PORT}/{env.REDIS_DB}",
|
||
"OPTIONS": {
|
||
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
||
"PASSWORD": env.REDIS_PASSWORD if env.REDIS_PASSWORD else None,
|
||
"SOCKET_CONNECT_TIMEOUT": 5, # 连接超时(秒)
|
||
"SOCKET_TIMEOUT": 5, # 读写超时(秒)
|
||
"CONNECTION_POOL_KWARGS": {"max_connections": 100}, # 连接池大小
|
||
"IGNORE_EXCEPTIONS": True, # Redis不可用时不抛异常,降级处理
|
||
},
|
||
"KEY_PREFIX": "djangoadmin", # Key前缀,避免多项目共用Redis时冲突
|
||
}
|
||
}
|
||
|
||
# ==================== 密码验证配置 ====================
|
||
# https://docs.djangoproject.com/en/3.2/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',
|
||
# 验证密码是否为纯数字
|
||
},
|
||
]
|
||
|
||
# ==================== 国际化配置 ====================
|
||
# https://docs.djangoproject.com/en/3.2/topics/i18n/
|
||
|
||
# 语言代码
|
||
LANGUAGE_CODE = 'en-us'
|
||
|
||
# 时区设置(亚洲/上海)
|
||
TIME_ZONE = 'Asia/Shanghai'
|
||
|
||
# 是否启用国际化
|
||
USE_I18N = True
|
||
|
||
# 是否启用本地化格式化
|
||
USE_L10N = True
|
||
|
||
# 是否使用时区支持(False表示不使用UTC)
|
||
USE_TZ = False
|
||
|
||
# ==================== 静态文件配置 ====================
|
||
# https://docs.djangoproject.com/en/3.2/howto/static-files/
|
||
|
||
# 静态文件访问URL前缀
|
||
STATIC_URL = '/static/'
|
||
|
||
# 静态文件搜索目录
|
||
STATICFILES_DIRS = [
|
||
os.path.join(BASE_DIR, "public/static"),
|
||
]
|
||
|
||
# ==================== 主键字段配置 ====================
|
||
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
|
||
|
||
# 默认主键字段类型
|
||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||
|
||
# ==================== Django REST Framework配置 ====================
|
||
|
||
REST_FRAMEWORK = {
|
||
# 默认认证类:使用JWT查询参数认证
|
||
'DEFAULT_AUTHENTICATION_CLASSES': ['api.extensions.auth.JwtQueryParamsAuthentication']
|
||
}
|
||
|
||
# ==================== 数据库表前缀配置 ====================
|
||
|
||
# 数据表前缀(从环境变量获取,默认为空)
|
||
# DATABASE_PREFIX = locals().get('DATABASE_PREFIX', "")
|
||
|
||
# ==================== 验证码相关配置 ===========================
|
||
|
||
# 验证码图片尺寸(宽度, 高度)
|
||
CAPTCHA_IMAGE_SIZE = (200, 60)
|
||
# 验证码字符个数
|
||
CAPTCHA_LENGTH = 6
|
||
# 验证码超时时间(分钟)
|
||
CAPTCHA_TIMEOUT = 1
|
||
# 验证码输出格式
|
||
CAPTCHA_OUTPUT_FORMAT = "%(image)s %(text_field)s %(hidden_field)s "
|
||
# 验证码字体大小
|
||
CAPTCHA_FONT_SIZE = 40
|
||
# 验证码前景色(绿色)
|
||
CAPTCHA_FOREGROUND_COLOR = "#1d953f"
|
||
# 验证码背景色(白色)
|
||
CAPTCHA_BACKGROUND_COLOR = "#ffffff"
|
||
# 验证码噪点函数配置
|
||
CAPTCHA_NOISE_FUNCTIONS = (
|
||
'captcha.helpers.noise_null', # 无噪点
|
||
"captcha.helpers.noise_arcs", # 弧线噪点
|
||
"captcha.helpers.noise_dots", # 点状噪点
|
||
)
|
||
# 验证码生成函数(随机字符验证码)
|
||
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge' # 字母验证码
|
||
# CAPTCHA_CHALLENGE_FUNCT = "captcha.helpers.math_challenge" # 加减乘除验证码(注释备选)
|
||
|
||
# ==================== 站点域名配置 ====================
|
||
|
||
# 站点域名(用于定时任务生成完整URL,从 .env 读取)
|
||
# 可选值示例: http://127.0.0.1:8000, http://localhost:8000, https://www.example.com
|
||
SITE_DOMAIN = os.getenv('SITE_DOMAIN', 'http://127.0.0.1:8000')
|