69 lines
1.8 KiB
Python
69 lines
1.8 KiB
Python
import logging
|
|
import os
|
|
from pathlib import Path
|
|
|
|
from flask import Flask
|
|
from flask_login import LoginManager
|
|
|
|
from .core import (
|
|
LicenseService,
|
|
MonitorEngine,
|
|
RuntimeState,
|
|
User,
|
|
ensure_secret_key,
|
|
load_license_key,
|
|
)
|
|
from .routes import register_routes
|
|
|
|
|
|
def configure_logging() -> None:
|
|
logging.basicConfig(
|
|
level=os.getenv("VFM_LOG_LEVEL", "INFO").upper(),
|
|
format="%(asctime)s [%(levelname)s] %(message)s",
|
|
)
|
|
|
|
|
|
def is_production_mode() -> bool:
|
|
value = os.getenv("VFM_ENV", "").strip().lower()
|
|
return value in {"prod", "production"}
|
|
|
|
|
|
def create_app(base_dir: str | Path | None = None, start_monitor: bool = True) -> Flask:
|
|
configure_logging()
|
|
|
|
resolved_base_dir = Path(base_dir) if base_dir else Path(__file__).resolve().parent.parent
|
|
secret_path = resolved_base_dir / "app_secret.key"
|
|
default_password = os.getenv("VFM_DEFAULT_PASSWORD", "admin")
|
|
|
|
app = Flask(
|
|
__name__,
|
|
template_folder=str(resolved_base_dir / "templates"),
|
|
)
|
|
app.secret_key = os.getenv("VFM_APP_SECRET") or ensure_secret_key(secret_path)
|
|
|
|
runtime_state = RuntimeState(resolved_base_dir, default_password)
|
|
license_service = LicenseService(
|
|
resolved_base_dir / "license.key",
|
|
load_license_key(require_env=is_production_mode()),
|
|
)
|
|
|
|
app.extensions["runtime_state"] = runtime_state
|
|
app.extensions["license_service"] = license_service
|
|
|
|
login_manager = LoginManager()
|
|
login_manager.init_app(app)
|
|
login_manager.login_view = "login"
|
|
|
|
@login_manager.user_loader
|
|
def load_user(user_id):
|
|
return User(user_id)
|
|
|
|
register_routes(app)
|
|
|
|
if start_monitor:
|
|
monitor_engine = MonitorEngine(runtime_state, license_service)
|
|
app.extensions["monitor_engine"] = monitor_engine
|
|
monitor_engine.start()
|
|
|
|
return app
|