bigywater.tech
Flask · 66

Flask Config 加载顺序

Flask 的配置到底按什么顺序生效?同一个键被多次设置谁说了算?环境变量里的 false 会变成什么?这篇依次加载六种来源并观察同一个键的变化。

29
Flask 3.1.3 的默认配置键数
最后写入的赢
多来源配置的覆盖规则
JSON
from_prefixed_env 解析环境变量值的格式

默认值

实测 · 本机执行输出
  默认键数 29 | DEBUG = False | SECRET_KEY = None | 自定义键 PAGE_SIZE 是否存在: False

上一篇:模板中执行函数的性能问题;下一篇:from_object()、from_envvar()、from_pyfile()。

覆盖顺序

实测 · 本机执行输出
  (开始)                                         PAGE_SIZE=None  ENV_NAME=None
  from_object("defaults_cfg")                  PAGE_SIZE=10    ENV_NAME=from-defaults-file
  from_pyfile("prod.py")                       PAGE_SIZE=50    ENV_NAME=from-prod-file
  from_file("cfg.json", load=json.load)        PAGE_SIZE=7     ENV_NAME=from-json
  from_prefixed_env()(FLASK_PAGE_SIZE=200)     PAGE_SIZE=200   ENV_NAME=from-env
  config.update(PAGE_SIZE=1)                   PAGE_SIZE=1     ENV_NAME=from-env
  config["PAGE_SIZE"] = 2                      PAGE_SIZE=2     ENV_NAME=from-env
  结论:没有「优先级表」,就是代码执行的先后顺序;最后一次写入的赢。

只收大写键

实测 · 本机执行输出
  lower_case 在 config 里吗: False | 加载进来的自定义键: ['ENV_NAME', 'FEATURES', 'PAGE_SIZE']

instance 目录

实测 · 本机执行输出
  instance_path = <项目>/instance | config.root_path = <项目>/instance
  from_pyfile("local.py") 之后 PAGE_SIZE = 99 | SECRET_KEY = instance-secret
  不开 instance_relative_config 时 config.root_path = <项目> (相对路径相对应用的 root_path)

from_prefixed_env

实测 · 本机执行输出
  FLASK_N        → config["N"] = 5  (int)
  FLASK_F        → config["F"] = 1.5  (float)
  FLASK_B1       → config["B1"] = True  (bool)
  FLASK_B2       → config["B2"] = False  (bool)
  FLASK_NONE     → config["NONE"] = None  (NoneType)
  FLASK_LIST     → config["LIST"] = [1, 2, 3]  (list)
  FLASK_TXT      → config["TXT"] = 'hello'  (str)
  FLASK_QUOTED   → config["QUOTED"] = 'hello'  (str)
  FLASK_EMPTY    → config["EMPTY"] = ''  (str)
  FLASK_DB       → config["DB"] = {'HOST': 'localhost', 'PORT': 5432}  (dict)
  FLASK_X        → config["X"] = '(不存在)'  (str)
  自定义前缀 from_prefixed_env("MYAPP"): 9

get_namespace

实测 · 本机执行输出
  get_namespace("SMTP_") → {'host': 'h', 'port': 25, 'use_tls': True}
  get_namespace("SMTP_", lowercase=False) → {'HOST': 'h', 'PORT': 25, 'USE_TLS': True}

分步演示

配置加载
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动
    • 没有验证:flask run 的命令行选项(如 --debug)与 FLASK_DEBUG 对 config["DEBUG"] 的影响顺序(见第 15 篇)、from_prefixed_env 对非常大的数字与科学计数法的解析、config 在多线程下被修改的行为
    京ICP备2026067502号-1京公网安备11010502063487号