Files
DjangoAdmin_Flask_EleVue/config/database.py
T
DjangoAdmin DevandClaude 15f2a5e097 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>
2026-08-07 12:12:06 +08:00

172 lines
6.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# +======================================================================
# | 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}")