前面我们有讲解 pydantic 库,今天讲解一下它的扩展库 pydantic_settings 。 是 Pydantic V2 中专门用于管理应用程序配置的模块,它基于强大的 Pydantic 模型验证机制,简化了配置加载和验证过程。 pip install pydantic_settings[pydantic]摘要:from pydantic_settings import BaseSettings, SettingsConfigDictclass Settings(BaseSettings):database_url: strDEBUG: bool = Falsemod
配置模型的基类,继承自 pydantic.BaseModel ,添加了从环境变量/文件加载配置的能力 from pydantic_settings import BaseSettings
替换旧版的 Config 类,用于配置模型行为(通过 model_config 属性设置) from pydantic_settings import SettingsConfigDict
定义配置模型
from pydantic_settings import BaseSettings, SettingsConfigDictclass Settings(BaseSettings):
database_url: str
DEBUG: bool = False
model_config = SettingsConfigDict(
env_file=".env", # .env文件加载
case_sensitive=False, # 忽略环境变量大小写
extra="ignore" # 忽略额外字段
)
settings = Settings
print(settings.database_url)
定义配置文件 .env DATABASE_URL=postgresql://user:password@localhost:5432/mydatabase
DEBUG=true
运行后输出
Python config.py# postgresql://user:password@localhost:5432/mydatabase
按从低到高的优先级合并配置源: SettingsConfigDict 参数 说明 env_file 指定 .env 文件路径(支持 .env , .env.prod 等) env_file_encoding 文件编码(默认 utf-8 ) env_prefix 环境变量前缀(如 "APP_" 使 api_key → APP_API_KEY ) case_sensitive 是否区分环境变量大小写(默认 False ) env_nested_delimiter 嵌套模型分隔符(如 __ 可将 DB__HOST 解析到 db.host ) secrets_dir 从 secrets 等目录加载敏感数据 extra 处理额外字段的策略( "allow" , "ignore" , "forbid" ) class DbConfig(BaseModel):
host: str = 'localhost'
port: int = 3306
name: str = 'exam'
user: str = 'roo'
password: SecretStr = SecretStr('123456')
db = DbConfig
print(db.password, type(db.password))
print(db.password.get_secret_value)
输出结果
**********123456
class SecureSettings(BaseSettings):
admin_password: str
# 从文件读取 secrets/admin_password
model_config = SettingsConfigDict(
secrets_dir="./secrets"
)
配置文件 .env1 [应用配置]
APP_DEBUG=True
[数据库配置]
APP_DB_HOST=192.168.31.112
APP_DB_PORT=3306
APP_DB_USER=root
APP_DB_PASSWORD=121212
APP_DB_NAME=test1
[redis配置]
APP_Redis_HOST=192.168.31.112
APP_REDIS_PORT=6379
存在多个配置项组
from pydantic import BaseModel, SecretStrfrom pydantic_settings import BaseSettings, SettingsConfigDict
# 数据库配置项
class DbConfig(BaseModel):
host: str = 'localhost'
port: int = 3306
name: str = 'exam'
user: str = 'roo'
password: SecretStr = SecretStr('123456')
# redis配置项
class RedisConfig(BaseModel):
host: str = 'localhost'
port: int = 6379
# 项目应用配置
class AppConfig(BaseSettings):
db: DbConfig
redis: RedisConfig
debug: bool = False
model_config = SettingsConfigDict(
env_file=".env1",
env_prefix="APP_",
env_nested_delimiter='_'
)
app = AppConfig
print(app.db)
print(app.db.password.get_secret_value)
print(app.redis)
输出结果如下:
host='192.168.31.112' port=3306 name='test1' user='root' password=SecretStr('**********')121212
host='192.168.31.112' port=6379
class Config(BaseSettings):
env: str = "dev"
# 根据 env 动态加载 .env.{env} 文件
model_config = SettingsConfigDict(
env_file=".env.{env}",
env_file_encoding="utf-8"
)
# 启动时设置环境变量:export ENV=prod
,开发者能以声明式方法管理配置,兼顾灵活性和安全性,是现代化 Python 应用的推荐配置方案。
来源:云阳好先生做实事