bigywater.tech
Flask · 68

环境变量配置

用环境变量做配置时有哪些坑?.env 是谁读的?flask 命令和 gunicorn 的行为一样吗?同名变量在 .env、.flaskenv、真实环境里谁赢?这篇用真实的进程逐个验证。

True
bool("false") 的结果(环境变量值是字符串)
.env
.env 与 .flaskenv 同名变量时生效的文件
不读
gunicorn 对 .env 的态度

字符串的陷阱

实测 · 本机执行输出
  bool(os.environ["T_FALSE"]) = True | bool("0") = True | bool("") = False | os.environ["T_NUM"] + 1 → TypeError: can only concatenate str (not "int") to str
  自己写的 env_bool: {'T_FALSE': False, 'T_ZERO': False, 'T_EMPTY': False, 'T_NUM': False, 'T_MISSING': False}
  os.environ["不存在"] → KeyError 'NOPE_X'
  os.environ.get("不存在") = None | .get(key, 默认) = 默认

上一篇:from_object()、from_envvar()、from_pyfile();下一篇:Development、Testing、Production 配置。

flask 命令读 FLASK_*

实测 · 本机执行输出
  FLASK_DEBUG=1 + FLASK_GREETING=from-env-var 下 /cfg: {'DEBUG': True, 'FLASK_DEBUG': '1', 'GREETING': 'from-env-var', 'MODE': 'from-dotenv', 'SECRET': 's3cret'}
  启动日志里: ['* Debug mode: on']

python-dotenv

实测 · 本机执行输出
  python-dotenv 已安装: True
  卸载 python-dotenv 后运行 flask routes:
    [' * Tip: There are .env files present. Install python-dotenv to use them.']
  安装 python-dotenv: ok

.env 与真实环境变量

实测 · 本机执行输出
  没有 --app(来自 .flaskenv 的 FLASK_APP=app),没设任何环境变量: {'DEBUG': False, 'FLASK_DEBUG': None, 'GREETING': 'prefixed-from-dotenv', 'MODE': 'from-dotenv', 'SECRET': 's3cret'}
  同名真实环境变量(MODE、FLASK_GREETING)已设置: {'DEBUG': False, 'FLASK_DEBUG': None, 'GREETING': 'real-prefixed', 'MODE': 'from-real-env', 'SECRET': 's3cret'}
  (.flaskenv 里写的是 MODE=from-flaskenv,.env 里写的是 MODE=from-dotenv;第一次输出里 MODE = from-dotenv:同名时 .env 的值生效)

gunicorn 与 .env

实测 · 本机执行输出
  gunicorn app:app 下 /cfg: {'DEBUG': False, 'FLASK_DEBUG': None, 'GREETING': None, 'MODE': None, 'SECRET': None}
  应用里 load_dotenv() 之后 gunicorn 下 /cfg: {'DEBUG': False, 'FLASK_DEBUG': None, 'GREETING': 'prefixed-from-dotenv', 'MODE': 'from-dotenv', 'SECRET': 's3cret'}

做法说明

实测 · 本机执行输出
  常见做法:.gitignore 里写 .env;仓库里放 .env.example(只有变量名与示例值)——这一节没有实验,只是做法说明

分步演示

环境变量配置
本步的对象

    本文用到的工具与边界

    • 本机 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 为本篇实验中重新安装(先卸载后装回)
    • 没有验证:Docker/Kubernetes 里注入环境变量的各种方式、systemd 的 EnvironmentFile、dotenv 的变量替换语法(${VAR})、.env 里引号与多行值的解析规则、云平台密钥管理服务
    京ICP备2026067502号-1京公网安备11010502063487号