feat(ops): 环境变量化配置 + 健康检查 + 启动脚本 + 部署/安全文档
主要变更: config - 引入 python-dotenv,从 .env 加载 SECRET_KEY / MAIL_* / SQLALCHEMY_DATABASE_URI - 拆分 BaseConfig / DevConfig / ProConfig,PEAR_ENV 控制切换 - ProConfig 在 init_app() 校验 SECRET_KEY,禁止使用默认值 ops - 新增 /healthz 端点:DB 探活 + 环境名 + 时间戳,失败返回 503 - 新增 start.bat (Windows) / Makefile (跨平台) 一键启动 / 初始化 - 新增 .env.example 模板;.gitignore 排除 .env / logs / vscode 等 - 新增 docs/DEPLOY.md(部署指南)和 docs/SECURITY.md(安全清单) - app.py 不再硬编码 debug=False,交给配置类决定 本提交不包含上一次会话的其它工作树修改(模板/导航相关),后续单独 PR。
This commit is contained in:
@@ -1,24 +1,40 @@
|
||||
import os
|
||||
|
||||
from dotenv import load_dotenv
|
||||
from flask import Flask
|
||||
|
||||
from applications.common.script import init_script
|
||||
from applications.config import BaseConfig
|
||||
from applications.config import BaseConfig, get_config_by_name
|
||||
from applications.extensions import init_plugs
|
||||
from applications.view import init_bps
|
||||
|
||||
# 项目根目录 = 本文件父目录的父目录
|
||||
BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
|
||||
|
||||
|
||||
def create_app():
|
||||
app = Flask(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
|
||||
# 1) 先加载 .env(在 BaseConfig 读取 os.environ 之前)
|
||||
# override=False:环境变量优先级高于 .env,便于 CI/CD 在部署时再覆盖
|
||||
load_dotenv(os.path.join(BASE_DIR, ".env"), override=False)
|
||||
|
||||
# 引入配置
|
||||
app.config.from_object(BaseConfig)
|
||||
app = Flask(BASE_DIR)
|
||||
|
||||
# 注册flask组件
|
||||
# 2) 根据 PEAR_ENV / FLASK_ENV 选择配置类,默认 dev
|
||||
env_name = os.environ.get("PEAR_ENV") or os.environ.get("FLASK_ENV") or "dev"
|
||||
config_cls = get_config_by_name(env_name)
|
||||
app.config.from_object(config_cls)
|
||||
|
||||
# 3) 把 BaseConfig 默认值里没写、但 .env 可能写了的 SQLALCHEMY_DATABASE_URI 等再覆盖一次
|
||||
if os.environ.get("SQLALCHEMY_DATABASE_URI"):
|
||||
app.config["SQLALCHEMY_DATABASE_URI"] = os.environ["SQLALCHEMY_DATABASE_URI"]
|
||||
|
||||
# 3.5) 让配置类有机会做运行时校验(例如 ProConfig 强制要求 SECRET_KEY)
|
||||
if hasattr(config_cls, "init_app"):
|
||||
config_cls.init_app(app)
|
||||
|
||||
# 4) 注册 flask 组件 / 蓝图 / 命令
|
||||
init_plugs(app)
|
||||
|
||||
# 注册蓝图
|
||||
init_bps(app)
|
||||
|
||||
# 注册命令
|
||||
init_script(app)
|
||||
|
||||
return app
|
||||
|
||||
Reference in New Issue
Block a user