mcp包的BaseSettings学习

声明:

我使用的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()
相关推荐
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。3 天前
2026.2.25监控学习
学习
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J3 天前
从“Hello World“ 开始 C++
c语言·c++·学习