fix: load .env without python-dotenv when package is missing
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user