作者:WangQiaomei
版本:1.0(2026/3/22)
核心亮点:一行代码读取.env 配置、自动类型校验、单例缓存不重复加载,新手也能秒上手!
🔥前言:你还在这样管理配置?太 Low 了!
是不是还在写这种 "垃圾代码" 管理配置?
python
运行
# ❌ 低效又危险的写法
import os
# 手动读取环境变量,还要手动转类型
DEBUG = os.getenv("DEBUG", "False") == "True"
# 敏感信息硬编码,提交Git直接泄露
DATABASE_URL = "mysql+pymysql://root:123456@localhost:3306/ai_agent"
# 每次用都要重新读,性能拉胯
def get_db_url():
return os.getenv("DATABASE_URL")
今天教你用 pydantic_settings + @lru_cache 组合拳,彻底解决配置管理的 3 大痛点:
✅ 敏感信息不硬编码(存在.env 文件)
✅ 自动类型转换 + 校验(不用手动转 bool/int)
✅ 配置只加载一次(@lru_cache 实现单例,性能拉满)
🎯核心认知:pydantic_settings 是什么?
pydantic_settings 是 Pydantic 官方出品的配置管理神器,堪称 Python 配置管理的 "天花板":
- 📥 自动从「环境变量」+「.env 文件」读取配置
- ✅ 自带类型验证(填错类型直接报错,避免线上事故)
- ⚙️ 支持默认值 +优先级(环境变量 > .env > 代码默认值)
- 🛡️ 敏感信息隔离(.env 加入.gitignore,永不提交到代码库)
📦 第一步:安装(一行命令搞定)
bash
运行
pip install pydantic-settings
🛠️基础用法:3 步搞定配置管理(直接复制即用)
步骤 1:定义配置类(核心!)
创建config.py,用BaseSettings定义配置结构,自带类型校验 + 默认值:
python
运行
# 作者:WangQiaomei
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
# 📝 应用基础配置(带默认值,不用在.env填)
APP_NAME: str = "AI Agent Platform"
APP_VERSION: str = "1.0.0"
DEBUG: bool = False # 自动转换为bool类型
# 📝 数据库配置(必须在.env填,无默认值)
DATABASE_URL: str = ""
# 📝 JWT认证配置(敏感信息,放.env)
JWT_SECRET_KEY: str = "default-secret-key" # 兜底默认值
JWT_EXPIRATION_HOURS: int = 24 # 自动转换为int
# 📝 大模型配置(阿里云DashScope)
DASHSCOPE_API_KEY: str = ""
DASHSCOPE_MODEL: str = "qwen3-max"
# 🎯 配置读取规则
class Config:
env_file = ".env" # 指定.env文件路径
case_sensitive = True # 字段名区分大小写(APP_NAME≠app_name)
步骤 2:创建.env 文件(存放敏感配置)
在项目根目录创建.env文件,一定要加入.gitignore,避免敏感信息泄露:
env
# .env文件(敏感配置都放这)
DEBUG=True
DATABASE_URL=mysql+pymysql://root:123456@localhost:3306/ai_agent
JWT_SECRET_KEY=aiagent_2026_secure_key
DASHSCOPE_API_KEY=sk-xxxxxxxxxxxxxxx # 你的阿里云API Key
DASHSCOPE_MODEL=qwen3-max
步骤 3:使用配置(简单到离谱)
python
运行
# 实例化配置类,自动读取.env+环境变量
settings = Settings()
# 直接调用,自带类型转换
print(settings.APP_NAME) # 输出:AI Agent Platform(默认值)
print(settings.DEBUG) # 输出:True(从.env读取,自动转bool)
print(settings.DATABASE_URL) # 输出:mysql+pymysql://root:123456@localhost:3306/ai_agent
print(settings.JWT_EXPIRATION_HOURS) # 输出:24(自动转int)
📊配置优先级:谁的话语权更高?
很多人踩坑的点!记住这个优先级:
plaintext
系统环境变量 > .env文件 > 代码默认值
🌰 举个例子:
python
运行
# 代码默认值
DEBUG: bool = False
# .env文件
DEBUG=True
# 系统环境变量(终端执行)
export DEBUG=False
最终settings.DEBUG = False(环境变量优先级最高)!
⚡性能优化:@lru_cache 让配置只加载一次
问题:默认写法会重复加载配置(巨耗性能)
python
运行
# ❌ 错误写法:每次调用都重新读取.env,创建新对象
def get_settings():
return Settings() # 调用10次=读取10次.env
# 验证:两次调用返回不同对象
settings1 = get_settings()
settings2 = get_settings()
print(settings1 is settings2) # 输出:False
解决:@lru_cache 实现单例(配置只加载一次)
python
运行
from functools import lru_cache
# ✅ 正确写法:@lru_cache缓存结果,实现单例
@lru_cache() # 关键装饰器!
def get_settings() -> Settings:
return Settings() # 仅第一次调用执行,后续直接返回缓存
# 验证:两次调用返回同一个对象
settings1 = get_settings()
settings2 = get_settings()
print(settings1 is settings2) # 输出:True
🧠@lru_cache 原理(一张图看懂)

🚀完整实战案例(可直接接入 FastAPI)
1. 完整 config.py
python
运行
"""
项目配置核心模块
作者:WangQiaomei
版本:1.0(2026/3/22)
"""
from functools import lru_cache
from typing import List, Optional
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
"""应用配置类(自动读取.env+环境变量)"""
# 应用基础配置
APP_NAME: str = "AI Agent Platform"
APP_VERSION: str = "1.0.0"
DEBUG: bool = True
# 数据库配置
DATABASE_URL: str = ""
# JWT认证配置
JWT_SECRET_KEY: str = "your-secret-key"
JWT_ALGORITHM: str = "HS256"
JWT_EXPIRATION_HOURS: int = 24
# 阿里云DashScope大模型配置
DASHSCOPE_API_KEY: str = ""
DASHSCOPE_MODEL: str = "qwen3-max"
class Config:
env_file = ".env" # 指定.env文件路径
case_sensitive = True # 字段名区分大小写
env_file_encoding = "utf-8" # 解决中文乱码
@lru_cache()
def get_settings() -> Settings:
"""获取配置实例(单例模式,避免重复加载)"""
return Settings()
# 创建全局配置对象(项目中可直接导入使用)
settings = get_settings()
2. 项目中 3 种使用方式(覆盖 99% 场景)
python
运行
# 方式1:直接导入全局配置(最简单)
from app.core.config import settings
print(f"数据库地址:{settings.DATABASE_URL}")
print(f"大模型API Key:{settings.DASHSCOPE_API_KEY}")
# 方式2:调用get_settings函数(推荐,单例保证)
from app.core.config import get_settings
settings = get_settings()
print(f"JWT过期时间:{settings.JWT_EXPIRATION_HOURS}小时")
# 方式3:FastAPI依赖注入(接口中使用)
from fastapi import FastAPI, Depends
from app.core.config import Settings, get_settings
app = FastAPI(title=settings.APP_NAME, version=settings.APP_VERSION)
@app.get("/api/info")
def get_app_info(current_settings: Settings = Depends(get_settings)):
return {
"app_name": current_settings.APP_NAME,
"version": current_settings.APP_VERSION,
"debug_mode": current_settings.DEBUG
}
📚类型自动转换:pydantic_settings 的隐藏大招
不用手动转类型!输入字符串,自动转为指定类型:
表格
| .env 中的值 | Python 字段类型 | 最终转换结果 |
|---|---|---|
DEBUG=True |
bool |
True |
DEBUG=false |
bool |
False |
PORT=8080 |
int |
8080 |
RATE=0.5 |
float |
0.5 |
HOSTS=["127.0.0.1","10.0.0.1"] |
List[str] |
["127.0.0.1","10.0.0.1"] |
TIMEOUT=30.5 |
int |
报错(类型不匹配,提前发现问题) |
🚩避坑指南(新手 99% 会踩的 5 个坑)
-
字段名大小写问题 :
case_sensitive=True时,APP_NAME≠app_name,.env 中要严格对应; -
中文乱码 :在
Config中加env_file_encoding = "utf-8"; -
.env 文件路径:默认读取项目根目录,非根目录要写绝对路径;
-
@lru_cache 装饰器 :必须加
(),写成@lru_cache会失效; -
敏感信息泄露 :一定要把
.env加入.gitignore,示例:plaintext
# .gitignore .env .env.* __pycache__/ *.pyc
🎯最佳实践(总结)
表格
| 组件 | 核心作用 | 使用技巧 |
|---|---|---|
BaseSettings |
定义配置结构,自动读取配置 | 给非必填项设合理默认值 |
.env文件 |
存储敏感配置 | 加入.gitignore,不提交到 Git |
@lru_cache |
缓存配置实例 | 装饰 get_settings 函数,实现单例 |
| 类型注解 | 自动转换 + 校验 | 所有字段都加类型注解,提前发现错误 |
📝最终总结
pydantic_settings + @lru_cache 是 Python 配置管理的 "黄金组合":
pydantic_settings解决「配置读取 + 类型校验 + 敏感信息隔离」;@lru_cache解决「重复加载配置 + 性能损耗 + 单例模式」;- 新手记住:敏感配置放.env,配置类加类型注解,获取函数加缓存!