Files
Neo-ZQYY/apps/backend/app/config.py

67 lines
2.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
后端配置加载
优先级(低 → 高):根 .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")