Python脚本如何隔离多环境数据

wen python案例 27

本文目录导读:

Python脚本如何隔离多环境数据

  1. 环境变量方式(最常用)
  2. 使用配置文件(YAML/JSON/INI)
  3. 使用 python-dotenv
  4. 使用 configparser(INI格式)
  5. 使用 Pydantic 配置管理(推荐)
  6. 完整项目示例
  7. 最佳实践建议
  8. 安装依赖

在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()

最佳实践建议

  1. 永远不要将敏感信息提交到版本控制(使用 .gitignore
  2. 使用环境变量作为默认配置的覆盖层
  3. 为不同环境提供示例配置文件(如 .env.example
  4. 使用配置文件模板,避免硬编码
  5. 考虑使用 python-decoupleenvirons 等库简化配置管理

安装依赖

pip install python-dotenv pyyaml pydantic configparser

选择哪种方式取决于项目复杂度、团队习惯和部署要求,小型项目使用 python-dotenv 就够用,大型项目推荐使用 Pydantic 或自定义配置类。

抱歉,评论功能暂时关闭!