用环境变量做配置时有哪些坑?.env 是谁读的?flask 命令和 gunicorn 的行为一样吗?同名变量在 .env、.flaskenv、真实环境里谁赢?这篇用真实的进程逐个验证。
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_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 已安装: True
卸载 python-dotenv 后运行 flask routes:
[' * Tip: There are .env files present. Install python-dotenv to use them.']
安装 python-dotenv: ok 没有 --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 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(只有变量名与示例值)——这一节没有实验,只是做法说明