bigywater.tech
Flask · 184

环境变量注入

配置从环境变量来,是容器和 12-factor 部署的常规做法。Flask 提供了 from_prefixed_env 与 from_envvar,但转换规则里有个坑。这篇用真实的进程逐项验证类型转换、密钥的陷阱、加载顺序以及 .env 的行为(生产环境关闭 DEBUG 见第 186 篇,密钥轮换见第 187 篇)。

int
APP_SECRET_KEY='12345' 被解析成的类型,session 随即 500
后者覆盖前者
默认 → 配置文件 → 环境变量
.env
flask 命令会读,gunicorn 不读

类型转换

实测 · 本机执行输出
环境变量 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")

上一篇:错误监控;下一篇:多进程日志重复问题。

SECRET_KEY 的坑

实测 · 本机执行输出
  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}

from_envvar 与 .env

实测 · 本机执行输出
  变量没设: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): '<路径>'

分步演示

Flask 环境变量注入
本步的对象

    本文用到的工具与边界

    • 本机 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,数字每次运行会有小幅抖动。python-dotenv 1.2.4、gunicorn
    • 没有验证:Docker/Kubernetes 注入环境变量的方式(Secret、ConfigMap)、systemd EnvironmentFile、其它配置库(pydantic-settings、dynaconf)、环境变量的进程内可见性与泄漏途径、配置热更新
    京ICP备2026067502号-1京公网安备11010502063487号