Flask 配置管理 (Configuration) 深度解析
Flask 配置管理 (Configuration) 深度解析
本文档详细解析 OakAMC 项目中的配置管理机制,分析其代码逻辑与设计模式。
1. 核心设计模式:类继承配置 (Class-based Configuration)
项目没有使用简单的 settings.py 或 .env 文件直接存储所有配置,而是采用了 Python 类继承 的方式。
文件位置: config.py
1.1 代码结构分析
import os
# 1. 基类 (Base Config)class Config: # 通用配置,所有环境共享 SECRET_KEY = os.environ.get('SECRET_KEY', 'default_key') EXPIRATION = 28800
# 也可以定义一些默认行为 JSON_AS_ASCII = False
# 2. 子类:开发环境 (Development)class DevelopmentConfig(Config): # 覆写或新增特定于开发环境的配置 DEBUG = True # 开发库地址 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://test:test@localhost/oakamc_test'
# 3. 子类:生产环境 (Production)class ProductionConfig(Config): # 生产环境严禁开启 DEBUG DEBUG = False # 线上库地址 (通常从环境变量获取,增强安全性) SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')1.2 这种写法的优势
- 复用性: 公共配置(如
SECRET_KEY默认值、分页大小等)写在父类Config里,子类自动继承,避免重复代码。 - 隔离性: 能够清晰地区分不同环境(Dev, Test, Prod)的配置,防止开发环境意外连接到生产数据库。
- 代码即配置: 可以使用 Python 代码逻辑(如
os.path.join拼接路径),比纯文本的.ini或.yaml更灵活。
2. 配置的加载与切换
文件位置: app/__init__.py
配置写好了,Flask 是怎么加载它的?
2.1 字典映射 (The Mapping)
在 config.py 的底部,定义了一个字典来管理这些类:
config = { 'development': DevelopmentConfig, 'production': ProductionConfig, 'default': DevelopmentConfig # 默认使用开发配置}2.2 工厂函数中的加载 (Loading)
在 create_app 函数中:
def create_app(config_name=None): # ... # 1. 如果没传 config_name,就从环境变量取 if config_name is None: config_name = os.getenv('FLASK_CONFIG', 'default')
# 2. 核心加载代码! # from_object 方法会读取类中所有大写字母开头的属性,并存入 app.config app.config.from_object(config[config_name]) # ...2.3 实际生效流程
- 启动时: 你在命令行设置
set FLASK_CONFIG=production。 - 运行时:
main.py调用create_app()。 - 加载时: 代码读取环境变量 -> 拿到
'production'-> 找到config['production'](即ProductionConfig类) -> 将该类下的DEBUG=False,DB_URI=...全部加载到app.config中。
通过这套机制,我们实现了一份代码,多环境自动适应。