【切尾】 - src/app.py:应用工厂(原 application/factory.py) - src/extensions.py:扩展注册编排(原 extensions/) - src/wsgi.py:生产 WSGI 入口 - 根 app.py 改为 from src.app import create_app(开发入口保留) - gunicorn/Docker/compose 指向 src.wsgi:app - 删除 application/、extensions/、utils/(全部代码已迁入 src/) 【清理】21 个 router 中间件导入改 src.core;修复 level 服务潜在 bug (utils.load2dict 不存在 → model_to_dict);测试文件 R 导入改 src.core 【里程碑】全项目 flake8 从 P1 基线 154 条 → **0 条**; 12 passed;app.py 与 src.wsgi 双入口均启动 Co-Authored-By: Claude <noreply@anthropic.com>
140 lines
4.5 KiB
Python
140 lines
4.5 KiB
Python
"""
|
|
配置模块入口
|
|
=============================================================
|
|
|
|
负责:
|
|
1. 加载 .env 环境变量(最先执行,保证子模块能读取配置)
|
|
2. 重新导出所有子模块的配置项,供业务代码统一使用
|
|
|
|
使用方式:
|
|
from config import FLASK_DEMO, DATABASE_URL, REDIS_URL, JWT_SALT
|
|
"""
|
|
|
|
import os
|
|
from dotenv import load_dotenv
|
|
|
|
|
|
def _load_env_file():
|
|
"""加载 .env 配置文件"""
|
|
root_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
|
|
env_path = os.path.join(root_path, '.env')
|
|
|
|
if os.path.exists(env_path):
|
|
load_dotenv(env_path)
|
|
return True
|
|
return False
|
|
|
|
|
|
# 在任何 config 子模块被 import 之前加载 .env
|
|
_load_env_file()
|
|
|
|
# ============================================================
|
|
# 重新导出所有子模块配置(统一入口)
|
|
# ============================================================
|
|
|
|
# 应用基础配置
|
|
from config.app import ( # noqa: E402
|
|
|
|
FLASK_NAME, FLASK_VERSION, FLASK_SECRET_KEY, FLASK_HOST, FLASK_PORT,
|
|
FLASK_SITE_DOMAIN, FLASK_APP, FLASK_ENV, FLASK_DEBUG, FLASK_USE_RELOADER,
|
|
FLASK_DEMO, FLASK_SYSTEM, FLASK_ROOT_PATH, FLASK_TEMPLATE_FOLDER,
|
|
FLASK_STATIC_FOLDER, FLASK_UPLOAD_DIR, FLASK_TEMP_PATH, FLASK_FILE_URL,
|
|
UPLOAD_ALLOWED_EXTS, UPLOAD_MAX_SIZE_MB, CORS_ALLOWED_ORIGINS,
|
|
)
|
|
|
|
# 数据库配置
|
|
from config.database import ( # noqa: E402
|
|
|
|
DatabaseConfig, DB_PREFIX, DB_DRIVER, DB_HOST, DB_PORT, DB_DATABASE,
|
|
DB_USERNAME, DB_PASSWORD, DB_DEBUG, DB_SSL, DATABASE_URL,
|
|
)
|
|
|
|
# Redis 缓存配置
|
|
from config.redis import ( # noqa: E402
|
|
|
|
REDIS_HOST, REDIS_PORT, REDIS_PASSWORD, REDIS_INDEX,
|
|
REDIS_AUTH, REDIS_DECODE_RESPONSES, REDIS_URL,
|
|
)
|
|
|
|
# JWT + 权限 + 白名单配置
|
|
from config.auth import ( # noqa: E402
|
|
|
|
JWT_SALT, JWT_EXPIRE_MINUTES, LOGIN_FAIL_MAX, LOGIN_LOCK_SECONDS,
|
|
PERMISSION_ENABLED, INTERNAL_API_KEY,
|
|
INTERNAL_ALLOWED_IPS, LOGIN_WHITELIST_EXACT, LOGIN_WHITELIST_PREFIX,
|
|
LOGIN_WHITELIST_WILDCARD, LOGIN_WHITELIST_DEBUG, LOGIN_WHITELIST_LOG_ACCESS,
|
|
CAPTCHA_BYPASS_CODE,
|
|
)
|
|
|
|
# 邮件配置
|
|
from config.mail import ( # noqa: E402
|
|
|
|
MAIL_MAILER, MAIL_SERVER, MAIL_PORT, MAIL_USE_SSL,
|
|
MAIL_USERNAME, MAIL_PASSWORD, MAIL_ENCRYPTION,
|
|
MAIL_FROM_NAME, MAIL_FROM_ADDRESS,
|
|
)
|
|
|
|
# 短信配置
|
|
from config.sms import ( # noqa: E402
|
|
|
|
SMS_PROVIDER, SMS_ALIYUN_ACCESS_KEY_ID, SMS_ALIYUN_ACCESS_KEY_SECRET,
|
|
SMS_ALIYUN_SIGN_NAME, SMS_ALIYUN_ENDPOINT,
|
|
SMS_ALIYUN_CONNECT_TIMEOUT, SMS_ALIYUN_READ_TIMEOUT,
|
|
)
|
|
|
|
# 验证码配置
|
|
from config.captcha import ( # noqa: E402
|
|
|
|
CAPTCHA_LENGTH,
|
|
CAPTCHA_EXPIRE,
|
|
CAPTCHA_RATE_LIMIT,
|
|
CAPTCHA_RATE_WINDOW,
|
|
CAPTCHA_CHARS,
|
|
CAPTCHA_FONT_PATH,
|
|
CAPTCHA_IMAGE_WIDTH,
|
|
CAPTCHA_IMAGE_HEIGHT,
|
|
CAPTCHA_FONT_SIZE,
|
|
CAPTCHA_NOISE_LINES,
|
|
CAPTCHA_NOISE_DOTS,
|
|
)
|
|
|
|
__all__ = [
|
|
# 应用基础配置
|
|
'FLASK_NAME', 'FLASK_VERSION', 'FLASK_SECRET_KEY', 'FLASK_HOST', 'FLASK_PORT',
|
|
'FLASK_SITE_DOMAIN', 'FLASK_APP', 'FLASK_ENV', 'FLASK_DEBUG', 'FLASK_USE_RELOADER',
|
|
'FLASK_DEMO', 'FLASK_SYSTEM', 'FLASK_ROOT_PATH', 'FLASK_TEMPLATE_FOLDER',
|
|
'FLASK_STATIC_FOLDER', 'FLASK_UPLOAD_DIR', 'FLASK_TEMP_PATH', 'FLASK_FILE_URL',
|
|
'UPLOAD_ALLOWED_EXTS', 'UPLOAD_MAX_SIZE_MB', 'CORS_ALLOWED_ORIGINS',
|
|
|
|
# 数据库配置
|
|
'DatabaseConfig', 'DB_PREFIX', 'DB_DRIVER', 'DB_HOST', 'DB_PORT', 'DB_DATABASE',
|
|
'DB_USERNAME', 'DB_PASSWORD', 'DB_DEBUG', 'DB_SSL', 'DATABASE_URL',
|
|
|
|
# Redis 配置
|
|
'REDIS_HOST', 'REDIS_PORT', 'REDIS_PASSWORD', 'REDIS_INDEX',
|
|
'REDIS_AUTH', 'REDIS_DECODE_RESPONSES', 'REDIS_URL',
|
|
|
|
# JWT + 权限 + 白名单配置
|
|
'JWT_SALT', 'JWT_EXPIRE_MINUTES', 'LOGIN_FAIL_MAX', 'LOGIN_LOCK_SECONDS',
|
|
'PERMISSION_ENABLED', 'INTERNAL_API_KEY',
|
|
'INTERNAL_ALLOWED_IPS', 'LOGIN_WHITELIST_EXACT', 'LOGIN_WHITELIST_PREFIX',
|
|
'LOGIN_WHITELIST_WILDCARD', 'LOGIN_WHITELIST_DEBUG', 'LOGIN_WHITELIST_LOG_ACCESS',
|
|
'CAPTCHA_BYPASS_CODE',
|
|
|
|
# 邮件配置
|
|
'MAIL_MAILER', 'MAIL_SERVER', 'MAIL_PORT', 'MAIL_USE_SSL',
|
|
'MAIL_USERNAME', 'MAIL_PASSWORD', 'MAIL_ENCRYPTION',
|
|
'MAIL_FROM_NAME', 'MAIL_FROM_ADDRESS',
|
|
|
|
# 短信配置
|
|
'SMS_PROVIDER', 'SMS_ALIYUN_ACCESS_KEY_ID', 'SMS_ALIYUN_ACCESS_KEY_SECRET',
|
|
'SMS_ALIYUN_SIGN_NAME', 'SMS_ALIYUN_ENDPOINT',
|
|
'SMS_ALIYUN_CONNECT_TIMEOUT', 'SMS_ALIYUN_READ_TIMEOUT',
|
|
|
|
# 验证码配置
|
|
'CAPTCHA_LENGTH', 'CAPTCHA_EXPIRE', 'CAPTCHA_RATE_LIMIT', 'CAPTCHA_RATE_WINDOW',
|
|
'CAPTCHA_CHARS', 'CAPTCHA_FONT_PATH', 'CAPTCHA_IMAGE_WIDTH',
|
|
'CAPTCHA_IMAGE_HEIGHT', 'CAPTCHA_FONT_SIZE',
|
|
'CAPTCHA_NOISE_LINES', 'CAPTCHA_NOISE_DOTS',
|
|
]
|