Flask 配置管理怎么做?开发、测试、生产环境配置如何区分?
简化版
Flask 配置通过 app.config 管理,可以从对象、文件、环境变量加载。开发、测试、生产环境要分开配置,敏感信息如 SECRET_KEY、数据库密码不能写死在代码里,生产中通常从环境变量或配置中心读取。
详细版
常见方式是在应用工厂里加载配置:
def create_app(config_object=None):
app = Flask(__name__)
app.config.from_object(DefaultConfig)
if config_object:
app.config.from_object(config_object)
return app
测试环境可关闭 CSRF、使用内存数据库或测试库;生产环境要设置强 SECRET_KEY、关闭 DEBUG、配置真实数据库和日志。面试重点是配置分层、敏感信息保护和应用工厂配合。
完整版教学
一、为什么配置不能散落在代码里
配置会随环境变化,代码不应。数据库地址、Redis 地址、日志级别、SECRET_KEY、第三方 API Key 都可能在开发、测试、生产不同。
代码: 稳定逻辑
配置: 环境差异
如果把生产密码写在仓库里,不仅切环境麻烦,还有泄露风险。
二、app.config 是什么
app.config 本质上是一个配置字典,Flask 和扩展都会读取它。比如 DEBUG、SECRET_KEY、数据库连接串等。
app.config["SECRET_KEY"] = "..."
扩展初始化时也常从这里读配置,所以要在初始化扩展前加载好配置。
三、常见加载方式
Flask 支持从对象、Python 文件、环境变量前缀等方式加载配置。
app.config.from_object("settings.ProductionConfig")
app.config.from_pyfile("config.py", silent=True)
app.config.from_prefixed_env()
| 方式 | 适合 |
|---|---|
| from_object | 项目内默认配置 |
| from_pyfile | 本地文件覆盖 |
| from_prefixed_env | 容器/生产环境 |
配置加载顺序很重要:默认值先加载,环境覆盖后加载。
四、环境配置如何分层
常见做法是定义 BaseConfig、DevelopmentConfig、TestingConfig、ProductionConfig。共同配置放基类,差异配置放子类。
class BaseConfig:
JSON_AS_ASCII = False
class TestingConfig(BaseConfig):
TESTING = True
测试环境要可控、隔离、快速;生产环境要安全、稳定、可观测。
五、SECRET_KEY 为什么重要
Flask 默认 Session 是签名 Cookie,SECRET_KEY 用于签名。如果 key 泄露或太弱,攻击者可能伪造 Cookie。生产必须用强随机值,并通过环境变量注入。
弱 key -> Cookie 签名可被伪造 -> 身份风险
不要把默认开发 key 带到生产。
六、和应用工厂的关系
应用工厂让测试可以创建不同配置的 app 实例,也方便命令行、worker、测试复用同一初始化流程。
app = create_app(TestingConfig)
如果全局创建 app 并立即读配置,测试和多环境切换会更困难。
七、配置校验和失败策略
生产配置不能只靠约定,启动时应检查必填项是否存在、类型是否正确。数据库地址缺失、SECRET_KEY 为空、DEBUG 错误开启,都应该在启动阶段暴露。
required = ["SECRET_KEY", "DATABASE_URL"]
for key in required:
if not app.config.get(key):
raise RuntimeError(f"missing config: {key}")
对于布尔值、端口、列表这类配置,要显式转换,不要把字符串 "false" 当成布尔值直接判断。
八、团队协作怎么落地
仓库可以提交默认配置类和 .env.example,但不提交真实 .env。README 里写清楚每个配置项的含义、默认值和是否必填。CI、测试和生产都按同一套配置入口加载,避免“本地一种写法,生产另一种写法”。
config.py: 默认结构
.env.example: 示例键
部署平台 secret: 真实值
配置文档越清楚,线上排查越少靠猜。
九、常见误区与追问
- 误区:DEBUG=True 生产也方便排查。 生产绝不能开,会泄露调试信息。
- 误区:SECRET_KEY 随便写一个字符串就行。 要强随机并保密。
- 误区:配置文件提交密码没关系。 仓库泄露或日志输出都很危险。
- 追问:测试配置怎么做? 用 TestingConfig,隔离数据库,开启 TESTING。
- 追问:环境变量怎么覆盖? 用
from_prefixed_env或os.environ。 - 追问:扩展什么时候初始化? 配置加载后再 init_app。
- 追问:配置中心适合什么场景? 多服务、多环境、动态配置时。
十、加强记忆
Flask 配置记成“默认配置 + 环境覆盖 + 敏感信息外置”。开发开 DEBUG,测试开 TESTING,生产强 SECRET_KEY 且关闭 DEBUG。应用工厂负责把配置和扩展初始化顺序管好。