67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
"""
|
||
后端配置加载
|
||
|
||
优先级(低 → 高):根 .env → 应用 .env.local → 环境变量
|
||
敏感值(DSN、Token)禁止提交,仅放在 .env / .env.local 中。
|
||
"""
|
||
|
||
import os
|
||
from pathlib import Path
|
||
|
||
from dotenv import load_dotenv
|
||
|
||
# 根 .env(公共配置)
|
||
_root_env = Path(__file__).resolve().parents[3] / ".env"
|
||
load_dotenv(_root_env, override=False)
|
||
|
||
# 应用级 .env.local(私有覆盖,优先级更高)
|
||
_local_env = Path(__file__).resolve().parents[1] / ".env.local"
|
||
load_dotenv(_local_env, override=True)
|
||
|
||
|
||
def get(key: str, default: str | None = None) -> str | None:
|
||
"""从环境变量读取配置值。"""
|
||
return os.getenv(key, default)
|
||
|
||
|
||
# ---- 数据库连接参数 ----
|
||
DB_HOST: str = get("DB_HOST", "localhost")
|
||
DB_PORT: str = get("DB_PORT", "5432")
|
||
DB_USER: str = get("DB_USER", "")
|
||
DB_PASSWORD: str = get("DB_PASSWORD", "")
|
||
# CHANGE 2026-02-15 | 默认指向测试库,生产环境通过 .env 覆盖
|
||
APP_DB_NAME: str = get("APP_DB_NAME", "test_zqyy_app")
|
||
|
||
# ---- JWT 认证 ----
|
||
JWT_SECRET_KEY: str = get("JWT_SECRET_KEY", "") # 生产环境必须设置
|
||
JWT_ALGORITHM: str = get("JWT_ALGORITHM", "HS256")
|
||
JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = int(get("JWT_ACCESS_TOKEN_EXPIRE_MINUTES", "30"))
|
||
JWT_REFRESH_TOKEN_EXPIRE_DAYS: int = int(get("JWT_REFRESH_TOKEN_EXPIRE_DAYS", "7"))
|
||
|
||
# ---- ETL 数据库连接参数(可独立配置,缺省时复用 zqyy_app 的连接参数) ----
|
||
ETL_DB_HOST: str = get("ETL_DB_HOST") or DB_HOST
|
||
ETL_DB_PORT: str = get("ETL_DB_PORT") or DB_PORT
|
||
ETL_DB_USER: str = get("ETL_DB_USER") or DB_USER
|
||
ETL_DB_PASSWORD: str = get("ETL_DB_PASSWORD") or DB_PASSWORD
|
||
# CHANGE 2026-02-15 | 默认指向测试库,生产环境通过 .env 覆盖
|
||
ETL_DB_NAME: str = get("ETL_DB_NAME", "test_etl_feiqiu")
|
||
|
||
# ---- CORS ----
|
||
# 逗号分隔的允许来源列表;缺省允许 Vite 开发服务器
|
||
CORS_ORIGINS: list[str] = [
|
||
o.strip()
|
||
for o in get("CORS_ORIGINS", "http://localhost:5173").split(",")
|
||
if o.strip()
|
||
]
|
||
|
||
# ---- ETL 项目路径 ----
|
||
# ETL CLI 的工作目录(子进程 cwd),缺省时按 monorepo 相对路径推算
|
||
ETL_PROJECT_PATH: str = get(
|
||
"ETL_PROJECT_PATH",
|
||
str(Path(__file__).resolve().parents[3] / "apps" / "etl" / "connectors" / "feiqiu"),
|
||
)
|
||
|
||
# ---- 通用 ----
|
||
TIMEZONE: str = get("TIMEZONE", "Asia/Shanghai")
|
||
LOG_LEVEL: str = get("LOG_LEVEL", "INFO")
|