chore: 基线提交(重构前代码快照)
- git 初始化 + .gitignore 补全(根 .env / logs / instance / __pycache__ 等) - 修复 utils/.gitignore 误将整个 utils/ 源码层忽略的问题,补入全部工具源码(含 ip2region.xdb) - 含后端全部代码:application / extensions / utils / config / migrations - 含前端 ui/(后续整体迁走) - 不含根 .env(含密钥,本地保留) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
# +======================================================================
|
||||
# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ]
|
||||
# +----------------------------------------------------------------------
|
||||
# | Copyright (c) 2021-2026 一米阳光团队 版权所有
|
||||
# +----------------------------------------------------------------------
|
||||
# | 开源协议: Apache-2.0
|
||||
# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。
|
||||
# +----------------------------------------------------------------------
|
||||
# | 官方网站: https://www.djangoadmin.cn
|
||||
# +----------------------------------------------------------------------
|
||||
# | 研发团队: 一米阳光团队 荣誉出品
|
||||
# +======================================================================
|
||||
|
||||
"""
|
||||
数据库配置模块
|
||||
=============================================================
|
||||
|
||||
负责配置 MySQL 数据库连接及相关参数,包含连接池、SSL 加密等。
|
||||
依赖:config/__init__.py 中的 _load_env_file() 已提前加载 .env
|
||||
"""
|
||||
|
||||
import os
|
||||
from urllib.parse import quote_plus
|
||||
from config.app import FLASK_SECRET_KEY, FLASK_UPLOAD_DIR
|
||||
from config.redis import REDIS_URL
|
||||
|
||||
# ============================================================
|
||||
# 数据库环境变量
|
||||
# ============================================================
|
||||
|
||||
# 数据库驱动(mysql / pgsql / sqlite)
|
||||
DB_DRIVER = os.getenv('DB_DRIVER', 'mysql')
|
||||
# 数据库地址
|
||||
DB_HOST = os.getenv('DB_HOST', '127.0.0.1')
|
||||
# 数据库端口(MySQL默认3306,PostgreSQL默认5432)
|
||||
DB_PORT = int(os.getenv('DB_PORT', 3306))
|
||||
# 数据库名称
|
||||
DB_DATABASE = os.getenv('DB_DATABASE', 'djangoadmin.flask.elevue')
|
||||
# 数据库账号
|
||||
DB_USERNAME = os.getenv('DB_USERNAME', 'root')
|
||||
# 数据库密码
|
||||
DB_PASSWORD = os.getenv('DB_PASSWORD', '')
|
||||
# 数据表前缀(用于区分同一数据库中不同应用的数据表)
|
||||
DB_PREFIX = os.getenv('DB_PREFIX', 'flask_')
|
||||
# 是否开启调试模式:True-打印SQL日志,False-不打印
|
||||
DB_DEBUG = os.getenv('DB_DEBUG', 'True') == 'True'
|
||||
# 是否启用数据库SSL加密连接(生产环境建议开启,防止数据明文传输)
|
||||
DB_SSL = os.getenv('DB_SSL', 'False') == 'True'
|
||||
# SSL CA证书路径(用于验证服务端证书,留空则信任系统CA)
|
||||
DB_SSL_CA = os.getenv('DB_SSL_CA', '')
|
||||
# SSL 客户端证书路径(双向认证时使用)
|
||||
DB_SSL_CERT = os.getenv('DB_SSL_CERT', '')
|
||||
# SSL 客户端私钥路径(双向认证时使用)
|
||||
DB_SSL_KEY = os.getenv('DB_SSL_KEY', '')
|
||||
|
||||
# ============================================================
|
||||
# 连接池配置
|
||||
# ============================================================
|
||||
|
||||
# 连接池常驻连接数(默认10,生产环境建议根据并发量调整)
|
||||
DB_POOL_SIZE = int(os.getenv('DB_POOL_SIZE', 10))
|
||||
# 超出pool_size后允许的最大额外连接(默认10,总连接数=pool_size+max_overflow)
|
||||
DB_MAX_OVERFLOW = int(os.getenv('DB_MAX_OVERFLOW', 10))
|
||||
# 连接自动回收时间/秒(默认1800,应小于MySQL的wait_timeout,防止"MySQL server has gone away")
|
||||
DB_POOL_RECYCLE = int(os.getenv('DB_POOL_RECYCLE', 1800))
|
||||
# 获取连接的超时时间/秒(默认30,超时抛出TimeoutError)
|
||||
DB_POOL_TIMEOUT = int(os.getenv('DB_POOL_TIMEOUT', 30))
|
||||
# 使用前是否检测连接存活(默认True,防止使用已被MySQL关闭的连接)
|
||||
DB_POOL_PRE_PING = os.getenv('DB_POOL_PRE_PING', 'True') == 'True'
|
||||
|
||||
# 数据库连接URL(方便SQLAlchemy直接使用)
|
||||
DATABASE_URL = f'mysql+pymysql://{quote_plus(DB_USERNAME)}:{quote_plus(DB_PASSWORD)}@{DB_HOST}:{DB_PORT}/{DB_DATABASE}'
|
||||
|
||||
|
||||
def _build_engine_options():
|
||||
"""
|
||||
构建SQLAlchemy引擎选项
|
||||
|
||||
包含连接池配置和SSL加密配置。
|
||||
连接池参数通过SQLALCHEMY_ENGINE_OPTIONS传递,
|
||||
确保所有连接管理策略集中在一处。
|
||||
"""
|
||||
options = {
|
||||
'pool_size': DB_POOL_SIZE,
|
||||
'max_overflow': DB_MAX_OVERFLOW,
|
||||
'pool_recycle': DB_POOL_RECYCLE,
|
||||
'pool_timeout': DB_POOL_TIMEOUT,
|
||||
'pool_pre_ping': DB_POOL_PRE_PING,
|
||||
}
|
||||
if DB_SSL:
|
||||
ssl_config = {}
|
||||
if DB_SSL_CA:
|
||||
ssl_config['ca'] = DB_SSL_CA
|
||||
if DB_SSL_CERT:
|
||||
ssl_config['cert'] = DB_SSL_CERT
|
||||
if DB_SSL_KEY:
|
||||
ssl_config['key'] = DB_SSL_KEY
|
||||
# 无证书路径时使用默认SSL(信任系统CA)
|
||||
if not ssl_config:
|
||||
ssl_config = True
|
||||
options['connect_args'] = {'ssl': ssl_config}
|
||||
return options
|
||||
|
||||
|
||||
class DatabaseConfig:
|
||||
"""
|
||||
数据库配置类
|
||||
|
||||
包含 MySQL 连接、SQLAlchemy 设置、路径等配置
|
||||
"""
|
||||
|
||||
# ============================================================
|
||||
# 基础配置
|
||||
# ============================================================
|
||||
|
||||
# 调试模式(从环境变量读取)
|
||||
DEBUG = DB_DEBUG
|
||||
|
||||
# Flask 秘钥(用于 session 加密等)
|
||||
# 启动时校验:未配置或过短则拒绝启动
|
||||
if not FLASK_SECRET_KEY or len(FLASK_SECRET_KEY) < 16:
|
||||
raise RuntimeError(
|
||||
"FLASK_SECRET_KEY 未配置或过短!请在 .env 中设置至少16字节的强随机密钥。\n"
|
||||
"生成方式:python -c \"import secrets; print(secrets.token_hex(32))\""
|
||||
)
|
||||
SECRET_KEY = FLASK_SECRET_KEY
|
||||
|
||||
# ============================================================
|
||||
# CSRF 防护配置
|
||||
# ============================================================
|
||||
|
||||
# 本项目使用 JWT(Authorization 头)认证,非 Cookie/Session,
|
||||
# 天然防 CSRF,因此 WTForms CSRF 保护无需开启。
|
||||
WTF_CSRF_CHECK_DEFAULT = False
|
||||
WTF_CSRF_ENABLED = False
|
||||
|
||||
# ============================================================
|
||||
# MySQL 数据库配置
|
||||
# ============================================================
|
||||
|
||||
# 构建 MySQL 连接 URI(使用 PyMySQL 驱动)
|
||||
SQLALCHEMY_DATABASE_URI = (
|
||||
f'mysql+pymysql://{quote_plus(DB_USERNAME)}:{quote_plus(DB_PASSWORD)}@'
|
||||
f'{DB_HOST}:{DB_PORT}/{DB_DATABASE}'
|
||||
)
|
||||
# 不追踪对象修改(提升性能)
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||
# 是否打印 SQL 语句(调试模式下开启)
|
||||
SQLALCHEMY_ECHO = DB_DEBUG
|
||||
# 数据库连接引擎选项(连接池 + SSL加密)
|
||||
SQLALCHEMY_ENGINE_OPTIONS = _build_engine_options()
|
||||
|
||||
# ============================================================
|
||||
# 路径配置
|
||||
# ============================================================
|
||||
|
||||
# 配置目录路径
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
# 静态文件目录
|
||||
STATIC_DIR = os.path.join(BASE_DIR, '../static')
|
||||
# 模板文件目录
|
||||
TEMPLATE_DIR = os.path.join(BASE_DIR, '../templates')
|
||||
# 文件上传目录
|
||||
FLASK_UPLOAD_DIR = FLASK_UPLOAD_DIR
|
||||
|
||||
|
||||
# 模块测试入口
|
||||
if __name__ == '__main__':
|
||||
print(f"数据库连接: {DatabaseConfig.SQLALCHEMY_DATABASE_URI}")
|
||||
print(f"调试模式: {DatabaseConfig.DEBUG}")
|
||||
print(f"文件上传目录: {DatabaseConfig.FLASK_UPLOAD_DIR}")
|
||||
Reference in New Issue
Block a user