本文目录导读:

- 环境变量方式(最常用)
- 使用配置文件(YAML/JSON/INI)
- 使用
python-dotenv库 - 使用
configparser(INI格式) - 使用
Pydantic配置管理(推荐) - 完整项目示例
- 最佳实践建议
- 安装依赖
在Python中隔离多环境数据(如开发、测试、生产环境)的常用方法有以下几种:
环境变量方式(最常用)
使用 os.environ + .env 文件
# .env 文件(不提交到版本控制) # 开发环境 DB_HOST=localhost DB_PORT=5432 DEBUG=True # 生产环境 # DB_HOST=prod.example.com # DB_PORT=5432 # DEBUG=False
# config.py
import os
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
class Config:
DEBUG = os.getenv('DEBUG', 'False').lower() == 'true'
DB_HOST = os.getenv('DB_HOST', 'localhost')
DB_PORT = int(os.getenv('DB_PORT', 5432))
class DevelopmentConfig(Config):
DEBUG = True
DB_HOST = 'localhost'
class ProductionConfig(Config):
DEBUG = False
DB_HOST = 'prod.db.example.com'
# 根据环境选择配置
ENV = os.getenv('APP_ENV', 'development')
config_map = {
'development': DevelopmentConfig,
'production': ProductionConfig,
}
current_config = config_map.get(ENV, DevelopmentConfig)()
使用配置文件(YAML/JSON/INI)
YAML 配置方式
# config.yaml
development:
database:
host: localhost
port: 5432
name: dev_db
debug: true
production:
database:
host: prod.example.com
port: 5432
name: prod_db
debug: false
# yaml_config.py
import yaml
import os
class YAMLConfig:
def __init__(self, env_name):
self.env_name = env_name
with open('config.yaml', 'r') as f:
self.config = yaml.safe_load(f)[env_name]
def get_database_config(self):
return self.config['database']
def is_debug(self):
return self.config.get('debug', False)
# 使用
env = os.getenv('APP_ENV', 'development')
config = YAMLConfig(env)
db_config = config.get_database_config()
使用 python-dotenv 库
# .env.development DB_HOST=localhost API_KEY=dev_key_123 # .env.production DB_HOST=prod.example.com API_KEY=prod_key_456
# dotenv_config.py
from dotenv import load_dotenv
import os
class EnvConfig:
@staticmethod
def load(env_name='development'):
env_file = f'.env.{env_name}'
if os.path.exists(env_file):
load_dotenv(env_file)
else:
load_dotenv('.env') # 默认加载
使用 configparser(INI格式)
# settings.ini [development] db_host = localhost db_port = 5432 debug = true [production] db_host = prod.example.com db_port = 5432 debug = false
# ini_config.py
import configparser
import os
class INIConfig:
def __init__(self, env_name):
config = configparser.ConfigParser()
config.read('settings.ini')
self.env_name = env_name
self.section = config[env_name]
def get(self, key, default=None):
return self.section.get(key, default)
# 使用
env = os.getenv('APP_ENV', 'development')
config = INIConfig(env)
db_host = config.get('db_host')
使用 Pydantic 配置管理(推荐)
# pydantic_config.py
from pydantic import BaseSettings
from typing import Optional
import os
class Settings(BaseSettings):
# 环境变量前缀可以自动识别
class Config:
env_prefix = 'APP_' # APP_DB_HOST
# 数据库配置
DB_HOST: str = 'localhost'
DB_PORT: int = 5432
DB_NAME: Optional[str] = 'dev_db'
# 应用配置
DEBUG: bool = False
SECRET_KEY: str = 'default-secret'
# 外部服务
API_KEY: Optional[str] = None
# 根据环境加载不同的.env文件
class EnvironmentSettings:
@staticmethod
def load():
env = os.getenv('APP_ENV', 'development')
env_file = f'.env.{env}' if env != 'development' else '.env'
from dotenv import load_dotenv
load_dotenv(env_file)
return Settings()
settings = EnvironmentSettings.load()
print(settings.DB_HOST) # 自动从环境变量读取
完整项目示例
# app.py
import os
from dotenv import load_dotenv
# 自动检测环境
ENVIRONMENT = os.getenv('PYTHON_ENV', 'development')
# 加载对应配置
if ENVIRONMENT == 'production':
load_dotenv('.env.production')
elif ENVIRONMENT == 'staging':
load_dotenv('.env.staging')
else:
load_dotenv('.env.development')
# 配置类
class AppConfig:
def __init__(self):
self.DB_CONFIG = {
'host': os.getenv('DB_HOST'),
'port': int(os.getenv('DB_PORT', 5432)),
'database': os.getenv('DB_NAME'),
'user': os.getenv('DB_USER'),
'password': os.getenv('DB_PASSWORD'),
}
self.REDIS_CONFIG = {
'host': os.getenv('REDIS_HOST', 'localhost'),
'port': int(os.getenv('REDIS_PORT', 6379)),
}
self.DEBUG = os.getenv('DEBUG', 'False').lower() == 'true'
self.SECRET_KEY = os.getenv('SECRET_KEY')
config = AppConfig()
最佳实践建议
- 永远不要将敏感信息提交到版本控制(使用
.gitignore) - 使用环境变量作为默认配置的覆盖层
- 为不同环境提供示例配置文件(如
.env.example) - 使用配置文件模板,避免硬编码
- 考虑使用
python-decouple或environs等库简化配置管理
安装依赖
pip install python-dotenv pyyaml pydantic configparser
选择哪种方式取决于项目复杂度、团队习惯和部署要求,小型项目使用 python-dotenv 就够用,大型项目推荐使用 Pydantic 或自定义配置类。