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()
相关推荐
好奇龙猫2 小时前
【人工智能学习-AI-MIT公开课第 20・21 概率推理】
人工智能·学习
stars-he2 小时前
FPGA学习笔记-图书馆存包柜,乒乓球游戏电路设计
笔记·学习·fpga开发
Gary Studio2 小时前
simulink simscape(机器人方向)学习笔记
笔记·学习
wdfk_prog3 小时前
[Linux]学习笔记系列 -- 内存管理与访问
linux·笔记·学习
laocooon5238578863 小时前
学习计算机知识的量变质变关系模态分析
学习
我命由我123453 小时前
Photoshop - Photoshop 工具栏(58)锐化工具
学习·ui·职场和发展·求职招聘·职场发展·学习方法·photoshop
前端小菜袅3 小时前
AI时代,新的技术学习方式
学习·ai编程
victory04313 小时前
大模型学习阶段总结和下一阶段展望
深度学习·学习·大模型
程序猿零零漆3 小时前
Spring之旅 - 记录学习 Spring 框架的过程和经验(十三)SpringMVC快速入门、请求处理
java·学习·spring