Flask 的配置对象本质上像个字典,但工程上不能当普通字典随手乱写。
官方文档长期强调一个原则:
配置要尽早加载。 因为扩展初始化时就可能要读配置。
一个比较稳的应用工厂写法是:
from flask import Flask
import os
def create_app(test_config=None):
app = Flask(__name__, instance_relative_config=True)
app.config.from_mapping(
SECRET_KEY="dev",
DATABASE=os.path.join(app.instance_path, "riderhub.sqlite"),
SESSION_COOKIE_HTTPONLY=True,
SESSION_COOKIE_SAMESITE="Lax",
)
if test_config is None:
app.config.from_pyfile("config.py", silent=True)
app.config.from_prefixed_env()
else:
app.config.update(test_config)
os.makedirs(app.instance_path, exist_ok=True)
return app这段代码背后,是 Flask 工程化最重要的配置直觉:
默认配置
│
├── from_mapping(...) -> 项目默认军令
├── from_pyfile(...) -> 机器本地军令
└── from_prefixed_env() -> 环境变量军令from_prefixed_env() 默认会读 FLASK_ 前缀环境变量,比如:
export FLASK_SECRET_KEY="replace-me"
export FLASK_MAIL_ENABLED=false然后在代码里:
app.config.from_prefixed_env()你就能拿到:
app.config["SECRET_KEY"]
app.config["MAIL_ENABLED"]而 instance_relative_config=True 和 instance_path 的意义,是把部署相关、机器相关、运行期会变化的文件放到实例目录,不和应用源码硬绑死。
这像什么?
像把军令册、补给表、临时驻地资料放在营地边上的独立仓库,而不是直接写死在兵书正文里。