「生产环境一定要关 DEBUG」大家都知道,但具体关掉了什么?这篇用真实的服务把几种启动方式下同一个异常的响应并排对比(只验证响应里有什么,以及如何防止误开;不演示任何利用方式)。环境变量注入见第 184 篇,密钥轮换见第 187 篇。
启动方式 状态 响应字节 含 Traceback 含源码行 1 / 0 含文件路径 app 状态 gunicorn,DEBUG 关(默认) 500 265 False False False debug=False propagate=None auto_reload=None level=30 gunicorn + FLASK_DEBUG=1 500 141 False False False debug=True propagate=None auto_reload=None level=10 flask run(默认,无 --debug) 500 265 False False False debug=False propagate=None auto_reload=None level=30 flask run --debug 500 15628 True True True debug=True propagate=None auto_reload=None level=10
上一篇:多进程日志重复问题;下一篇:Secret Key 轮换。
调试器的风险见第 132 篇;这一篇只对比响应内容与防误开。
DEBUG off :每个请求 94 µs(TEMPLATES_AUTO_RELOAD=None,jinja_env.auto_reload=False) DEBUG debug :每个请求 100 µs(TEMPLATES_AUTO_RELOAD=None,jinja_env.auto_reload=True)
APP_ENV=production,DEBUG 关 → HTTP 200(master 还在运行:True)
APP_ENV=production + FLASK_DEBUG=1 → 请求失败:ConnectionRefusedError(master 还在运行:False);日志: "production" and app.debug: raise RuntimeError("refusing to start: DEBUG is on in production") | RuntimeError: refusing to start: DEBUG is on in production | refusing to start: DEBUG is on in production