全书目录

第二十九篇:Flask 完全指南 —— 轻骑兵微服务街区宇宙

第八章:配置系统 —— 军令册要早装、分层装、别写死

1 分钟 317 字 第 525 / 962 个阅读单元

Flask 的配置对象本质上像个字典,但工程上不能当普通字典随手乱写。

官方文档长期强调一个原则:

配置要尽早加载。 因为扩展初始化时就可能要读配置。

一个比较稳的应用工厂写法是:

py
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 工程化最重要的配置直觉:

text
默认配置
   │
   ├── from_mapping(...)      -> 项目默认军令
   ├── from_pyfile(...)       -> 机器本地军令
   └── from_prefixed_env()    -> 环境变量军令

from_prefixed_env() 默认会读 FLASK_ 前缀环境变量,比如:

bash
export FLASK_SECRET_KEY="replace-me"
export FLASK_MAIL_ENABLED=false

然后在代码里:

py
app.config.from_prefixed_env()

你就能拿到:

py
app.config["SECRET_KEY"]
app.config["MAIL_ENABLED"]

instance_relative_config=Trueinstance_path 的意义,是把部署相关、机器相关、运行期会变化的文件放到实例目录,不和应用源码硬绑死。

这像什么?

像把军令册、补给表、临时驻地资料放在营地边上的独立仓库,而不是直接写死在兵书正文里。