Flask 虽然轻量,但项目一大,配置就杂乱起来了。数据库地址、调试模式、密钥啥的,不想硬编码在代码里,就得搞点配置管理技巧。
这篇主要讲两块:
- 用环境变量管理敏感配置
- 用 config 文件(py 或 .env)统一管理多环境配置
一、为什么不能直接写死配置?
- 安全问题:数据库密码、密钥不能硬编码到代码里,特别是开源项目
- 环境差异:开发、测试、生产环境配置大不一样,切换麻烦
- 维护成本:代码改配置混一起,复杂又容易出错
二、环境变量管理(推荐)
1. 直接用 OS 环境变量
Python 里用 os.environ
读:
import os
SECRET_KEY = os.environ.get("SECRET_KEY", "default_secret")
DATABASE_URL = os.environ.get("DATABASE_URL", "sqlite:///test.db")
启动前在终端设置:
export SECRET_KEY="超复杂密钥"
export DATABASE_URL="mysql://user:pass@host/db"
flask run
Windows PowerShell:
$env:SECRET_KEY="超复杂密钥"
优点:安全、灵活,适合 Docker / 云环境。
2. 用 python-dotenv 加载 .env
文件
安装:
pip install python-dotenv
项目根目录放个 .env
:
SECRET_KEY=超复杂密钥
DATABASE_URL=mysql://user:pass@host/db
代码里:
from dotenv import load_dotenv
import os
load_dotenv() # 自动加载 .env 文件
SECRET_KEY = os.environ.get("SECRET_KEY")
DATABASE_URL = os.environ.get("DATABASE_URL")
这样开发时不用每次都手动 export,方便快捷。
三、Flask 自带 Config 对象的使用
Flask app 有个内置的 app.config
,支持多种方式加载配置。
1. 从 Python 文件加载
建个 config.py
:
DEBUG = True
SECRET_KEY = "测试密钥"
SQLALCHEMY_DATABASE_URI = "sqlite:///test.db"
加载:
app.config.from_object("config")
2. 支持多环境配置
config.py
:
class Config:
SECRET_KEY = "default_secret"
class DevConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = "sqlite:///dev.db"
class ProdConfig(Config):
DEBUG = False
SQLALCHEMY_DATABASE_URI = "mysql://prod_db"
启动时选:
app.config.from_object("config.DevConfig")
3. 结合环境变量灵活切换
import os
env = os.environ.get("FLASK_ENV", "dev")
if env == "prod":
app.config.from_object("config.ProdConfig")
else:
app.config.from_object("config.DevConfig")
四、总结
- 敏感信息用环境变量,切忌硬编码
.env
+ python-dotenv 开发时更方便- Flask config.py 支持层级继承,利于多环境管理
- 结合环境变量实现启动时自动切换配置环境
配置管理一搞定,后续开发、测试、部署都省事不少。