我将以开发者的视角为您详细介绍 python-dotenv
:
一、python-dotenv 核心概念
作用:管理项目环境变量,实现配置与代码分离
核心价值:
- 🔒 保护敏感信息(API密钥、数据库密码)
- 🌀 实现开发/生产环境无缝切换
- 📁 统一配置管理入口
二、基础使用示例
1. 安装库
pip install python-dotenv
2. 创建 .env
文件
# 数据库配置
DB_HOST = "localhost"
DB_PORT = 3306
DB_USER = "admin"
DB_PASS = "pass123!"
# 功能开关
DEBUG_MODE = "True"
MAX_RETRY = "3"
3. 使用环境变量
from dotenv import load_dotenv
import os
# 加载.env文件
load_dotenv()
# 读取配置
db_config = {
"host": os.getenv("DB_HOST"),
"port": int(os.getenv("DB_PORT", 5432)), # 带默认值
"user": os.getenv("DB_USER"),
"password": os.getenv("DB_PASS")
}
print(f"数据库连接信息:{db_config}")
三、高级功能
1. 多环境配置
# 加载生产环境配置
load_dotenv(".env.production")
# 根据环境切换
if os.getenv("ENV") == "dev":
load_dotenv(".env.dev")
2. 类型转换
from dotenv import dotenv_values
config = dotenv_values()
config = {k: int(v) if v.isdigit() else v
for k, v in config.items()}
3. 结合Flask使用
from flask import Flask
from dotenv import load_dotenv
load_dotenv()
app = Flask(__name__)
app.config["SECRET_KEY"] = os.getenv("FLASK_SECRET")
四、最佳实践
-
安全规范:
- 将
.env
加入.gitignore
- 使用示例文件
.env.example
DB_HOST = "your_host" DB_PASS = "your_password"
- 将
-
优先级规则(从高到低):
- 系统环境变量
.env
文件- 代码默认值
五、常见问题
Q1:为什么读取不到变量?
# 检查文件路径
load_dotenv("/absolute/path/to/.env")
# 检查变量命名
print(os.environ) # 查看所有环境变量
Q2:如何保护已有变量?
# 不覆盖已存在的变量
load_dotenv(override=False)
Q3:如何处理布尔值?
DEBUG = os.getenv("DEBUG_MODE", "False") == "True"
扩展内容
博客内容主体如上
下面详细说明多环境配置管理的最佳实践方案,并提供代码示例:
一、多环境配置方案设计
# 推荐的文件结构
config/
├── .env.dev # 开发环境
├── .env.test # 测试环境
├── .env.prod # 生产环境
└── settings.py # 配置加载器
二、企业级配置加载器
import os
from pathlib import Path
from dotenv import load_dotenv
class EnvManager:
def __init__(self):
self.env = os.getenv("ENV", "dev") # 默认开发环境
self.base_dir = Path(__file__).parent
def load(self):
# 加载通用配置
load_dotenv(self.base_dir / ".env")
# 加载环境专属配置
env_file = self.base_dir / f".env.{self.env}"
if env_file.exists():
load_dotenv(env_file, override=True)
@property
def db_config(self):
return {
"host": os.getenv("DB_HOST"),
"port": int(os.getenv("DB_PORT", 3306)),
"user": os.getenv("DB_USER"),
"password": os.getenv("DB_PASS")
}
@property
def debug_mode(self):
return os.getenv("DEBUG") == "True"
# 初始化配置
env_manager = EnvManager()
env_manager.load()
三、环境切换策略
1. 通过环境变量切换
# 启动时指定环境
ENV=prod python app.py
2. 自动化检测(根据运行环境)
# 在EnvManager类中添加
def _detect_environment(self):
if "SERVER_SOFTWARE" in os.environ:
return "prod" if "Production" in os.environ else "test"
return "dev" if "VIRTUAL_ENV" in os.environ else "prod"
四、安全增强方案
1. 敏感信息加密
from cryptography.fernet import Fernet
class SecretManager:
def __init__(self):
self.cipher = Fernet(os.getenv("ENCRYPT_KEY"))
def decrypt(self, encrypted):
return self.cipher.decrypt(encrypted.encode()).decode()
# 使用示例
secret_manager = SecretManager()
real_password = secret_manager.decrypt(os.getenv("DB_PASS_ENC"))
2. 生产环境推荐方案
# 结合AWS Secrets Manager
aws secretsmanager get-secret-value --secret-id prod/db
五、部署自动化实践
1. Docker集成
FROM python:3.9
ENV ENV=prod
COPY config/.env.prod /app/config/.env.prod
RUN pip install -r requirements.txt
CMD ["gunicorn", "app:app"]
2. CI/CD配置(GitHub Actions示例)
jobs:
deploy:
steps:
- name: Inject env
run: |
echo "DB_PASS=${{ secrets.PROD_DB_PASS }}" >> $GITHUB_WORKSPACE/config/.env.prod
六、监控与审计方案
# 配置变更审计
def track_config_changes():
import hashlib
current_hash = hashlib.md5(open('.env').read().encode()).hexdigest()
if current_hash != last_known_hash:
alert_admin("配置变更警告!")