"""Flask 应用工厂。""" import os import logging from flask import Flask from config import Config from database import db from models import Instance # 触发表创建 # ── 全局服务 ─────────────────────────────────────────────────── from engine.instances import InstanceManager from services.user_service import UserService from services.backup_service import set_backup_dir def create_app(): # 确保密码已设置(首次启动自动设置默认密码) from auth import get_or_set_password get_or_set_password() app = Flask(__name__) app.config.from_object(Config) app.config["SECRET_KEY"] = os.environ.get( "SM_SECRET_KEY", "sm-dev-key-change-in-prod" ) app.config["SESSION_COOKIE_HTTPONLY"] = True app.config["SESSION_COOKIE_SAMESITE"] = "Lax" # 日志 logging.basicConfig( level=getattr(logging, Config.LOG_LEVEL), format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", ) # 数据库 db.init_app(app) app.db = db # 全局服务注册 with app.app_context(): db.create_all() # 初始化全局 db.app from database import db as _db _db.app = app # 用户服务 user_service = UserService() user_service.set_db_app(app) app.user_service = user_service # 实例管理器 instance_manager = InstanceManager(user_service, flask_app=app) app.instance_manager = instance_manager # 备份目录 set_backup_dir(Config.BACKUP_DIR) # 注册蓝图 from auth import bp as auth_bp from web.routes import bp as web_bp from api.v1 import bp as api_bp app.register_blueprint(auth_bp) app.register_blueprint(web_bp) app.register_blueprint(api_bp, url_prefix="/api") return app