Pydantic Settings v2继承配置时触发Field Required错误求助
问题:Pydantic Settings v2 配置继承时无法读取父类指定的.env文件
我基于Pydantic Settings v2编写配置类:CommonCfg继承BaseSettings并指定读取.env文件;ProductionCfg继承CommonCfg并指定读取prod.env文件。预期ProductionCfg可从.env获取LTDRN_REST_ENDPOINT、FULLRN_REST_ENDPOINT,从prod.env获取HOST,同时通过命令行传入SYS_USER。但实例化ProductionCfg时出现字段缺失的验证错误,给CommonCfg字段设置默认值能正常运行,但希望通过配置继承实现需求。
代码文件(mycfg.py)
from pydantic_settings import BaseSettings, SettingsConfigDict class CommonCfg(BaseSettings): SYS_USER: str LTDRN_REST_ENDPOINT: str FULLRN_REST_ENDPOINT: str model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8', case_sensitive=True, extra='forbid') class ProductionCfg(CommonCfg): HOST: str model_config = SettingsConfigDict(env_file='prod.env', env_file_encoding='utf-8', case_sensitive=True, extra='forbid') #print(CommonCfg.model_config) #cfg_values = CommonCfg() cfg_values = ProductionCfg() print(cfg_values.LTDRN_REST_ENDPOINT) print(cfg_values.FULLRN_REST_ENDPOINT) print(cfg_values.SYS_USER) #print(cfg_values.HOST)
配置文件内容
.env
LTDRN_REST_ENDPOINT=/rest/latest/custom/create_limited_draft_rn FULLRN_REST_ENDPOINT=/rest/latest/custom/create_full_draft_rn
prod.env
HOST=https://at.host.com
执行命令
SYS_USER=xyzuser python mycfg.py
报错信息
Traceback (most recent call last): File "/home/build/python-app/path/mycfg.py", line 34, in <module> cfg_values = ProductionCfg() File "/home/build/python-app/venv/lib/python3.9/site-packages/pydantic_settings/main.py", line 71, in __init__ super().__init__( File "/home/build/python-app/venv/lib/python3.9/site-packages/pydantic/main.py", line 164, in __init__ __pydantic_self__.__pydantic_validator__.validate_python(data, self_instance=__pydantic_self__) pydantic_core._pydantic_core.ValidationError: 2 validation errors for ProductionCfg LTDRN_REST_ENDPOINT Field required [type=missing, input_value={'HOST': 'https://host...', 'SYS_USER': 'xyzuser'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.4/v/missing FULLRN_REST_ENDPOINT Field required [type=missing, input_value={'HOST': 'https://host...', 'SYS_USER': 'xyzuser'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.4/v/missing
解决方案
问题根源在于子类的model_config会完全覆盖父类的配置,而非合并。ProductionCfg的model_config只指定了prod.env,导致父类CommonCfg中配置的.env文件没有被加载,因此无法读取其中的两个字段。
修正方案1:继承并修改父类的配置
在子类中复制父类的model_config,再添加/修改所需的配置项:
class ProductionCfg(CommonCfg): HOST: str # 复制父类配置并更新env_file为多个文件 model_config = CommonCfg.model_config.copy() model_config['env_file'] = ('.env', 'prod.env')
修正方案2:直接指定多个环境文件
在子类的SettingsConfigDict中,将env_file设为包含多个文件的列表,按加载顺序排列(后加载的文件会覆盖前序文件的同名变量):
class ProductionCfg(CommonCfg): HOST: str model_config = SettingsConfigDict( env_file=['.env', 'prod.env'], env_file_encoding='utf-8', case_sensitive=True, extra='forbid' )
两种方案都能让ProductionCfg同时加载.env和prod.env,配合命令行传入的SYS_USER,即可满足所有字段的读取需求。
内容的提问来源于stack exchange,提问作者Ramakrishnan Srinivasan
相关产品推荐
相关产品推荐

