bigywater.tech
Flask · 67

from_object()、from_envvar()、from_pyfile()

三个 from_ 方法各自读什么、怎么出错?类配置里的列表会不会互相污染?环境变量里到底存配置值还是文件路径?这篇逐个试。

大写
所有 from_* 方法只加载的键的形式
同一个列表
两个 app 从同一个类加载后 TAGS 的关系
执行代码
from_pyfile 对配置文件的处理(不是解析)

from_object

实测 · 本机执行输出
  from_object("settings"): {'DEBUG': True, 'SECRET_KEY': 'from-module', 'ITEMS': ['a', 'b']} | 小写与下划线开头 lower/_private 在 config 里: False False | 函数 func: False | 类 Nested: False
  from_object(模块对象):SECRET_KEY = from-module
  from_object(类 Dev(继承 Base)):DEBUG=True PAGE=10 TAGS=['t']
  from_object(类 Prod):DEBUG=False PAGE=100 TAGS=['t']
  from_object(实例 Dev()):DEBUG=True PAGE=10 TAGS=['t']
  from_object("settings_dir.base.Dev")(带点的路径指向类):DEBUG = True PAGE = 10

上一篇:Flask Config 加载顺序;下一篇:环境变量配置。

可变值共享

实测 · 本机执行输出
  a1 改了 TAGS 后,a2 的 TAGS = ['t', 'polluted'] | Base.TAGS = ['t', 'polluted'] | 同一个对象: True

from_pyfile

实测 · 本机执行输出
(from_pyfile 里的 print 也会执行)
  加载 dyn.cfg 之后: {'HOME_SET': True, 'COMPUTED': 42, 'ITEMS': [0, 2, 4]}
  文件不存在:FileNotFoundError: [Errno 2] Unable to load configuration file (No such file or directory): '<项目>/nope.cfg'
  文件不存在 + silent=True:返回 False
  语法错误:SyntaxError: '(' was never closed (bad_syntax.cfg, line 1)

from_envvar

实测 · 本机执行输出
  环境变量没设置 → RuntimeError: The environment variable 'APP_SETTINGS' is not set and as such configuration could not be loaded. Set this variable and make it point to a configuration file
  silent=True → False
(from_pyfile 里的 print 也会执行)
  设置 APP_SETTINGS=<路径> 后 → True | COMPUTED = 42

from_file

实测 · 本机执行输出
  tomllib: {'TITLE': 'toml 标题', 'PORT': 8080, 'DB': {'HOST': 'h'}}
  json 里的小写键 title: False | 大写 UP: True (from_file 内部调用 from_mapping,同样只收大写键)
  from_mapping 同一份 json: {'UP': 1} | title 在吗: False

from_mapping

实测 · 本机执行输出
  from_mapping({"A": 1, "b": 2}, C=3, d=4) → {'A': 1, 'b': None, 'C': 3, 'd': None}
  update / 赋值 不过滤大小写: {'b': 2, 'd': 4}

分步演示

配置加载方法
本步的对象

    本文用到的工具与边界

    • 本机 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,数字每次运行会有小幅抖动
    • 没有验证:from_object 加载带 @property 的类、配置文件的热重载、Windows 路径写法、from_pyfile 的编码与 BOM 处理
    京ICP备2026067502号-1京公网安备11010502063487号