Flask 项目配置多环境变量的核心方案是通过继承配置类并结合操作系统环境变量区分场景,禁止将敏感信息硬编码在代码中。适用所有基于 Flask 构建的 Web 服务,风险边界在于确保生产环境配置文件不被提交至版本控制系统。
先说结论:使用配置类继承加环境变量加载是 Flask 多环境管理的标准实践。
- 适合中小型 Flask 项目及其衍生框架
- 先准备 python-dotenv 库与独立配置文件
- 验收时检查敏感字段是否泄露
命令速用版
在终端直接设置环境变量启动不同环境,无需修改代码。
# Linux/macOS 设置开发环境
export FLASK_APP=app.py
export FLASK_DEBUG=1
flask run
# Windows PowerShell 设置生产环境
$env:FLASK_APP = "app.py"
$env:FLASK_DEBUG = "0"
flask run
# 指定配置对象启动
export FLASK_CONFIG=production
flask run为什么会这样
分离环境配置是为了避免敏感信息泄露并简化部署流程。
硬编码数据库密码或密钥在代码中会导致版本控制泄露风险,且每次部署都需要修改代码。Flask 设计之初就支持通过 app.config 对象加载配置,配合操作系统环境变量可以实现代码与配置分离。Flask 2.3 版本后官方弃用了 FLASK_ENV 变量,推荐使用 FLASK_DEBUG 或自定义配置类加载方式,这要求开发者更明确地管理配置来源。
分步处理
按照以下步骤建立配置类体系并加载环境变量。
第一步:安装依赖
在项目根目录执行命令安装 python-dotenv,用于自动加载 .env 文件。
pip install python-dotenv第二步:定义配置类
新建 config.py,定义基类及不同环境子类,敏感信息从 os.environ 获取。
import os
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY')
SQLALCHEMY_TRACK_MODIFICATIONS = False
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL')
class ProductionConfig(Config):
DEBUG = False
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')第三步:创建环境文件
在项目根目录创建 .env 文件,写入变量键值对,注意该文件必须加入 .gitignore。
FLASK_CONFIG=development
SECRET_KEY=hard-to-guess-string
DEV_DATABASE_URL=sqlite:///dev.db第四步:应用工厂加载
在 app.py 或工厂函数中根据环境变量选择配置类。
from flask import Flask
from config import DevelopmentConfig, ProductionConfig
def create_app():
app = Flask(__name__)
config_name = os.environ.get('FLASK_CONFIG', 'development')
if config_name == 'production':
app.config.from_object(ProductionConfig)
else:
app.config.from_object(DevelopmentConfig)
return app怎么验证是否生效
通过打印配置对象和检查调试模式状态确认环境加载正确。
启动应用后访问特定路由或查看终端日志,确认 DEBUG 值是否符合预期。可以在代码中添加临时路由打印 app.config['DEBUG'] 和 app.config['SQLALCHEMY_DATABASE_URI'] 的前缀,生产环境不应显示完整敏感信息。检查进程环境变量命令 printenv | grep FLASK 应显示当前设置的值。
常见坑
- .env 文件提交:务必在 .gitignore 中添加 .env,防止密钥泄露至仓库。
- FLASK_ENV 弃用:Flask 2.3+ 不再推荐依赖 FLASK_ENV 自动切换配置,需手动指定配置类。
- 默认值风险:获取环境变量时使用 os.environ.get 需设置合理的默认值或强制报错,避免生产环境因缺配置而静默失败。
常见问题
如何在不同服务器间切换环境配置?
通过操作系统层面设置环境变量实现,无需修改代码。
在目标服务器的 shell 配置文件(如 .bashrc)或容器启动参数中设置 FLASK_CONFIG 和密钥变量,重启服务即可生效。
SECRET_KEY 生成有固定格式吗?
没有固定格式,但必须足够随机且保密。
建议使用 secrets.token_hex(16) 生成随机字符串,生产环境每次部署可更换,但会导致现有会话失效。
.env 文件在生产环境安全吗?
文件权限可控时安全,但推荐优先使用容器密钥管理服务。
确保服务器文件权限设置为仅所有者可读,或使用 Kubernetes Secrets、AWS Secrets Manager 等专用工具注入环境变量。
参考来源
- Flask Official Documentation, Configuration Handling, https://flask.palletsprojects.com/en/latest/config/
- Flask Official Documentation, Environment Variables, https://flask.palletsprojects.com/en/latest/cli/#environment-variables