ソースを参照

e签宝 config.py

dujian 3 週間 前
コミット
8d467e1255
1 ファイル変更55 行追加29 行削除
  1. 55 29
      alien_gateway/config.py

+ 55 - 29
alien_gateway/config.py

@@ -1,45 +1,70 @@
+from pydantic import field_validator
 from pydantic_settings import BaseSettings, SettingsConfigDict
 from typing import Any, Dict, List
 from dotenv import load_dotenv
 from urllib.parse import quote
 import os
-load_dotenv()
+
+# Docker/Jenkins 挂载 /app/.env.produ;本地开发可同路径或环境变量覆盖
+load_dotenv(".env.produ")
+
+
+def _strip_env_quotes(value: str | None) -> str | None:
+    if value is None:
+        return None
+    v = value.strip()
+    if len(v) >= 2 and v[0] == v[-1] and v[0] in ('"', "'"):
+        return v[1:-1].strip()
+    return v
+
 
 class Settings(BaseSettings):
     # 基础配置
     PROJECT_NAME: str = "Alien Cloud Python"
     API_V1_STR: str = "/api/v1"
-    
+
     # 鉴权配置 (原 alien-gateway 职责)
-    SECRET_KEY: str = os.getenv("SECRET_KEY")
-    ALGORITHM: str = os.getenv("ALGORITHM")
-    ACCESS_TOKEN_EXPIRE_MINUTES: int = os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES")  # 7天
-    
-    # 数据库配置
-    DB_USER: str = os.getenv("DB_USER")
-    DB_PASSWORD: str = os.getenv("DB_PASSWORD")
-    DB_HOST: str = os.getenv("DB_HOST")
-    DB_PORT: int = os.getenv("DB_PORT")
-    DB_NAME: str = os.getenv("DB_NAME")
+    SECRET_KEY: str = ""
+    ALGORITHM: str = "HS256"
+    ACCESS_TOKEN_EXPIRE_MINUTES: int = 10080
+
+    # 数据库配置(生产须与 Java alien_produ 一致)
+    DB_USER: str = "root"
+    DB_PASSWORD: str = ""
+    DB_HOST: str = ""
+    DB_PORT: int = 3306
+    DB_NAME: str = "alien_produ"
 
     # Redis Sentinel 高可用配置
-    # 例: REDIS_SENTINELS=192.168.2.251:36379,192.168.2.252:36379,192.168.2.253:36379
-    REDIS_SENTINELS: str = os.getenv("REDIS_SENTINELS", "")
-    REDIS_MASTER_NAME: str = os.getenv("REDIS_MASTER_NAME", "mymaster")
-    REDIS_PASSWORD: str = os.getenv("REDIS_PASSWORD", "")
-    REDIS_DB: int = int(os.getenv("REDIS_DB", "0"))
-    REDIS_SENTINEL_USERNAME: str = os.getenv("REDIS_SENTINEL_USERNAME", "")
-    REDIS_SENTINEL_PASSWORD: str = os.getenv("REDIS_SENTINEL_PASSWORD", "")
-    REDIS_SOCKET_TIMEOUT: float = float(os.getenv("REDIS_SOCKET_TIMEOUT", "0.5"))
-    REDIS_CONNECT_TIMEOUT: float = float(os.getenv("REDIS_CONNECT_TIMEOUT", "1.0"))
-    # 下游服务地址
-    STORE_BASE_URL: str = os.getenv("STORE_BASE_URL")  # alien_store 服务地址
-
-    # 阿里云短信配置
-    ALIYUN_SMS_SIGN_NAME_CONTRACT: str = os.getenv("ALIYUN_SMS_SIGN_NAME_CONTRACT")
-    ALIYUN_SMS_TEMPLATE_CODE_CONTRACT: str = os.getenv("ALIYUN_SMS_TEMPLATE_CODE_CONTRACT")
-    ALIYUN_ACCESS_KEY_ID: str = os.getenv("ALIYUN_ACCESS_KEY_ID")
-    ALIYUN_ACCESS_KEY_SECRET: str = os.getenv("ALIYUN_ACCESS_KEY_SECRET")
+    REDIS_SENTINELS: str = ""
+    REDIS_MASTER_NAME: str = "mymaster"
+    REDIS_PASSWORD: str = ""
+    REDIS_DB: int = 0
+    REDIS_SENTINEL_USERNAME: str = ""
+    REDIS_SENTINEL_PASSWORD: str = ""
+    REDIS_SOCKET_TIMEOUT: float = 0.5
+    REDIS_CONNECT_TIMEOUT: float = 1.0
+    STORE_BASE_URL: str = ""
+
+    ALIYUN_SMS_SIGN_NAME_CONTRACT: str = ""
+    ALIYUN_SMS_TEMPLATE_CODE_CONTRACT: str = ""
+    ALIYUN_ACCESS_KEY_ID: str = ""
+    ALIYUN_ACCESS_KEY_SECRET: str = ""
+
+    @field_validator(
+        "DB_HOST",
+        "DB_USER",
+        "DB_NAME",
+        "DB_PASSWORD",
+        "SECRET_KEY",
+        "STORE_BASE_URL",
+        mode="before",
+    )
+    @classmethod
+    def strip_quoted_env(cls, value: Any) -> Any:
+        if isinstance(value, str):
+            return _strip_env_quotes(value) or ""
+        return value
 
 
 
@@ -111,6 +136,7 @@ class Settings(BaseSettings):
     model_config = SettingsConfigDict(
         case_sensitive=True,
         env_file=".env.produ",
+        extra="ignore",
     )
 
 settings = Settings()