diff --git a/app.py b/app.py index 7fa41d7..a859b40 100644 --- a/app.py +++ b/app.py @@ -3,7 +3,6 @@ import secrets from pathlib import Path from typing import Optional -from dotenv import load_dotenv from flask import Flask, flash, redirect, render_template, request, url_for from flask_login import LoginManager, current_user, login_required, login_user, logout_user from flask_wtf.csrf import CSRFProtect @@ -11,9 +10,45 @@ from flask_wtf.csrf import CSRFProtect from forms import GroupForm, LoginForm, ServiceForm from models import Service, ServiceGroup, User, db -# 与 app.py 同目录的 .env;若文件不存在则忽略。已存在于操作系统中的同名变量不会被覆盖。 _ROOT = Path(__file__).resolve().parent -load_dotenv(_ROOT / ".env") + + +def _load_env_file(path: Path) -> None: + """若未安装 python-dotenv,用最小实现加载 .env(不覆盖已有环境变量)。""" + if not path.is_file(): + return + try: + raw = path.read_text(encoding="utf-8-sig") + except OSError: + return + for line in raw.splitlines(): + s = line.strip() + if not s or s.startswith("#"): + continue + if s.lower().startswith("export "): + s = s[7:].lstrip() + if "=" not in s: + continue + key, _, rest = s.partition("=") + key = key.strip() + if not key: + continue + val = rest.strip() + if len(val) >= 2 and val[0] == val[-1] and val[0] in "\"'": + val = val[1:-1] + if key not in os.environ: + os.environ[key] = val + + +try: + from dotenv import load_dotenv as _dotenv_load +except ImportError: + _dotenv_load = None + +if _dotenv_load: + _dotenv_load(_ROOT / ".env") +else: + _load_env_file(_ROOT / ".env") login_manager = LoginManager() csrf = CSRFProtect()