如何配置Pydantic Settings使初始设置环境变量无需前缀?
Pydantic Settings配置方案:混合无前缀与带前缀嵌套类
核心思路
通过给InitialSettings设置空环境变量前缀,同时为其他嵌套类指定对应前缀,结合AppSettings的字段配置,实现两种规则共存:InitialSettings无论单独初始化还是嵌套,都读取无前缀的环境变量;其他嵌套类使用类名前缀的环境变量。
具体实现代码
from pydantic_settings import BaseSettings, SettingsConfigDict class InitialSettings(BaseSettings): sentry_dsn: str model_config = SettingsConfigDict( env_file="settings.env", env_prefix="", # 强制使用空前缀,直接读取SENTRY_DSN extra="ignore" # 忽略未定义变量,避免单独初始化时报错 ) class StorageSettings(BaseSettings): path: str max_size: int model_config = SettingsConfigDict( env_prefix="STORAGE__" # 指定前缀,对应STORAGE__PATH、STORAGE__MAX_SIZE ) class AppSettings(BaseSettings): init: InitialSettings storage: StorageSettings model_config = SettingsConfigDict( env_file="settings.env", extra="forbid", # 禁止未定义的环境变量 env_nested_delimiter="__", # 为init字段单独指定空前缀,覆盖默认的嵌套前缀规则 model_fields={ "init": {"env_prefix": ""} } ) # 单独初始化InitialSettings,直接读取SENTRY_DSN initial_settings = InitialSettings() # 初始化AppSettings,init读取SENTRY_DSN,storage读取带前缀的变量 app_settings = AppSettings()
关键配置说明
- InitialSettings:
env_prefix=""确保无论是否被嵌套,都直接读取无前缀的环境变量;extra="ignore"保证单独初始化时,不会因settings.env中存在其他变量而验证失败。 - StorageSettings:手动设置
env_prefix="STORAGE__",对应带前缀的环境变量,符合常规嵌套类的配置习惯。 - AppSettings:
extra="forbid"拦截未定义的环境变量,避免冗余配置;通过model_fields给init字段指定空前缀,打破默认的嵌套前缀规则(原本会生成INIT__SENTRY_DSN),同时storage字段遵循默认的前缀推导逻辑。
验证效果
- 单独初始化
InitialSettings:正常读取SENTRY_DSN,不受其他变量干扰。 - 初始化
AppSettings:init.sentry_dsn正确读取SENTRY_DSN。storage.path读取STORAGE__PATH,storage.max_size读取STORAGE__MAX_SIZE。- 若
settings.env存在未定义的变量,直接触发验证错误,符合extra="forbid"的要求。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

