配置从环境变量来,是容器和 12-factor 部署的常规做法。Flask 提供了 from_prefixed_env 与 from_envvar,但转换规则里有个坑。这篇用真实的进程逐项验证类型转换、密钥的陷阱、加载顺序以及 .env 的行为(生产环境关闭 DEBUG 见第 186 篇,密钥轮换见第 187 篇)。
环境变量 APP_x = config 里的类型值
'42' int 42
'true' bool True
'false' bool False
'[1,2]' list [1, 2]
'abc' str 'abc'
'0' int 0
'1.5' float 1.5
'null' NoneType None
'True' str 'True'
"'quoted'" str "'quoted'"
'' str ''
APP_I__J=x(双下划线表示嵌套)→ config["I"] = {'J': 'x'}
对比:直接 os.environ.get(...) 拿到的字符串再 bool():{'0': True, 'false': True, 'False': True, 'no': True}(任何非空字符串都是 True,包括 "0" 与 "false")APP_SECRET_KEY='12345' → config 里是 int → 访问带 session 的视图:HTTP 500 APP_SECRET_KEY='abcdef' → config 里是 str → 访问带 session 的视图:HTTP 200 APP_SECRET_KEY='1e3' → config 里是 float → 访问带 session 的视图:HTTP 500 APP_SECRET_KEY='true' → config 里是 bool → 访问带 session 的视图:HTTP 500 APP_SECRET_KEY='s3cr3t-key' → config 里是 str → 访问带 session 的视图:HTTP 200
from_mapping(默认值) → {'LEVEL': 'default', 'NAME': 'default', 'ONLY_DEFAULT': 1}
from_pyfile(base.py) → {'LEVEL': 'file', 'NAME': 'from-file', 'ONLY_DEFAULT': 1}
from_prefixed_env('APP') → {'LEVEL': 'env', 'NAME': 'from-file', 'ONLY_DEFAULT': 1}变量没设:RuntimeError: The environment variable 'NOPE_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(没加载,也不报错) 指向 prod.cfg:返回 True,MODE = 'prod' 指向不存在的文件:FileNotFoundError: [Errno 2] Unable to load configuration file (No such file or directory): '<路径>'