我正在考虑使用pydantic_settings_yaml将YAML配置文件加载到Pydantic模型中。理想情况下,我应该有一个包含环境无关配置的global.yml,然后是一个环境特定配置的env.yml。目前还不清楚pydantic_settings_yaml如何处理这个问题。我希望避免每次加载配置时都创建一个合并的.yml。
下面的代码将把dev.yml或live.yml读入Pydantic模型,但不读入global.yml。
app_config.py
env = os.getenv("ENVIRONMENT", "").lower()
match env:
case "dev":
yaml_filename = "dev.yml"
secrets_sub_dir = "dev"
case "live":
yaml_filename = "live.yml"
secrets_sub_dir = "live"
case _:
raise Exception(f"Unrecognised environment: {env}")
class Settings(YamlBaseSettings):
test_api_one: Dict[str, str]
class Config:
secrets_dir = f"/secrets/{secrets_sub_dir}"
yaml_file = Path(__file__).parent / yaml_filename
config = Settings()
dev.yml
'test_api_one':
'uri': 'https://dev_api/'
'secret': <file:dev_secret>
live.yml
'test_api_one':
'uri': 'https://live_api/'
'secret': <file:live_secret>
global.yml
'test_api_one':
'dateFormat': '%Y-%m-%d'
'dateTimeFormat': '%Y-%m-%dT%H:%M:%SZ'
1条答案
按热度按时间lx0bsm1f1#
由于我对你提到的一揽子计划有疑问(见我上面的评论),我建议你自己实施。
Pydantic文档解释了如何自定义设置源。为了确保嵌套字典“适当地”更新,您还可以使用非常方便的
pydantic.utils.deep_update
函数。显然,您需要安装
pyyaml
才能使其工作。下面是一个例子:
现在假设这些是有问题的文件:
global.yaml
dev.yaml
执行
print(BaseSettings().json(indent=4))
的输出是这样的:一个三个三个一个