fix: load .env without python-dotenv when package is missing

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-05-12 15:48:38 +08:00
parent 91814368af
commit e3b9fca45d
+38 -3
View File
@@ -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()