声明:
我使用的mcp版本为1.25.0。
一、什么场景下用BaseSettings呢?
BaseSettings 是 Pydantic 提供的专门用于管理应用配置 / 环境变量的基类,它的核心价值在于:
- 自动从环境变量 、
.env文件中加载配置数据,无需手动读取解析 - 继承了 Pydantic 的类型校验、数据转换能力,确保配置参数合法
- 支持配置默认值、嵌套配置,简化复杂应用的配置管理
适用场景:
- 项目中需要区分「开发 / 测试 / 生产」环境的配置(如数据库地址、端口、密钥)
- 敏感配置(如 API 密钥、数据库密码)不想硬编码在代码中,通过环境变量注入
- 需要统一管理所有配置项,便于维护和后续扩展
二、SettingsConfigDict 是什么?适用场景?
SettingsConfigDict 是 Pydantic V2 版本中引入的配置字典类 ,用于为BaseSettings(或BaseModel)配置额外的行为参数,替代了 Pydantic V1 中的Config类。
适用场景:
- 指定
.env文件的路径,让BaseSettings自动加载该文件中的配置 - 配置环境变量的「前缀」,避免不同项目的环境变量命名冲突
- 配置字段名与环境变量名的映射规则、是否忽略多余配置等
三、目录文件结构
bash
my_config_project/
├── .env # 环境变量配置文件(不提交到版本库)
├── .env.example # 环境变量示例文件(提交到版本库,供团队参考)
└── main.py # 核心代码,加载和使用配置
3.1 .env文件
bash
# 应用基础配置
APP_NAME=MyAwesomeProject
APP_ENV=development # 开发环境:development,生产环境:production
APP_PORT=8000
# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=123456
DB_NAME=my_project_db
# 敏感配置(API密钥)
API_SECRET=my_ultra_secure_api_secret_123
3.2 main文件
python
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
# 定义配置类,继承BaseSettings
class AppSettings(BaseSettings):
"""应用配置类,自动从环境变量/.env文件加载配置"""
# -------- 配置字段定义(支持类型注解、默认值、字段校验) --------
# 应用基础配置
app_name: str = Field(default="MyProject", description="应用名称")
app_env: str = Field(default="development", description="环境类型(development/production)")
app_port: int = Field(default=8000, description="应用运行端口")
# 数据库配置
db_host: str = Field(default="localhost", description="数据库主机地址")
db_port: int = Field(default=3306, description="数据库端口")
db_user: str = Field(default="root", description="数据库用户名")
db_password: str = Field(default="", description="数据库密码")
db_name: str = Field(default="my_db", description="数据库名称")
# 敏感配置
api_secret: str = Field(description="API访问密钥(必填,无默认值)")
# -------- 配置类的行为配置(使用SettingsConfigDict) --------
model_config = SettingsConfigDict(
# 1. 指定.env文件路径(支持绝对路径/相对路径,多个文件可传入列表)
env_file=".env",
# 2. 指定.env文件编码格式
env_file_encoding="utf-8",
# 3. 配置环境变量前缀(可选,如设置为"MY_APP_",则环境变量名需为MY_APP_APP_NAME)
# env_prefix="MY_APP_",
# 4. 允许字段名与环境变量名大小写不敏感匹配(默认True)
case_sensitive=False,
# 5. 忽略未定义在配置类中的额外环境变量(默认False,不忽略则会报错)
extra="ignore",
# 6. 配置字段别名(可选,此处演示,实际可通过Field(alias="XXX")单独配置)
alias_generator=None
)
# -------- 使用配置 --------
def main():
# 实例化配置类(自动加载.env文件/环境变量,完成类型校验)
settings = AppSettings()
# 打印配置信息(演示使用)
print("=" * 50)
print(f"应用名称:{settings.app_name}")
print(f"运行环境:{settings.app_env}")
print(f"运行端口:{settings.app_port}")
print("=" * 50)
print(
f"数据库连接信息:mysql+pymysql://{settings.db_user}:{settings.db_password}@{settings.db_host}:{settings.db_port}/{settings.db_name}")
print("=" * 50)
print(f"API密钥(隐藏后5位):{settings.api_secret[:-5]}*****")
print("=" * 50)
# 后续可将settings传递给数据库连接、FastAPI应用等组件
# 例如:创建数据库引擎、配置FastAPI的跨域等
if __name__ == "__main__":
main()
四、如何是嵌套结构,如何解析?
配置文件
bash
# 应用基础配置(非嵌套,直接与AppSettings字段对应)
APP_NAME=MyAwesomeProject
APP_ENV=development
# 数据库嵌套配置(核心:使用__分隔外层db和内层字段)
DB__HOST=localhost
DB__PORT=3306
DB__USER=root
DB__PASSWORD=123456
DB__NAME=my_project_db
# 若有其他敏感配置(可选,延续嵌套规则即可)
API_SECRET=my_ultra_secure_api_secret_123
设置类
python
from pydantic import BaseModel
from pydantic_settings import BaseSettings, SettingsConfigDict
class DatabaseSettings(BaseModel):
host: str
port: int
user: str
password: str
name: str
class AppSettings(BaseSettings):
app_name: str
app_env: str
api_secret: str
db: DatabaseSettings # 嵌套子配置类
# 配置行为(指定.env文件和嵌套分隔符)
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
env_nested_delimiter="__", # 关键:指定嵌套分隔符为双下划线
case_sensitive=False,
extra="ignore"
)
主程序
python
from app_settings import AppSettings
# -------- 使用配置 --------
def main():
# 实例化配置类(自动加载.env文件/环境变量,完成类型校验)
settings = AppSettings()
# 打印配置信息(演示使用)
print("=" * 50)
print(f"应用名称:{settings.app_name}")
print(f"运行环境:{settings.app_env}")
print("=" * 50)
print(
f"数据库连接信息:mysql+pymysql://{settings.db.user}:{settings.db.password}@{settings.db.host}:{settings.db.port}/{settings.db.name}")
print("=" * 50)
print(f"API密钥(隐藏后5位):{settings.api_secret[:-5]}*****")
print("=" * 50)
# 后续可将settings传递给数据库连接、FastAPI应用等组件
# 例如:创建数据库引擎、配置FastAPI的跨域等
if __name__ == "__main__":
main()