bigywater.tech
Flask · 69

Development、Testing、Production 配置

怎么让同一份代码在开发、测试、生产里有不同配置?哪些配置项必须区分?缺了关键配置会在什么时候才发现?这篇写三套配置并逐一验证。

3 套
本篇的配置类:Development、Testing、Production(继承同一个基类)
启动时失败
生产缺 SECRET_KEY 时的处理(而不是第一个请求时 500)
异常传出
TESTING=True 时视图异常在 test client 里的表现

三套配置

实测 · 本机执行输出
  development  {'DEBUG': True, 'ENV_NAME': 'development', 'PAGE_SIZE': 20, 'SECRET_KEY': 'dev-only-secret', 'SESSION_COOKIE_SECURE': False, 'SQLALCHEMY_DATABASE_URI': 'sqlite:///app.db', 'TESTING': False}
  testing      {'DEBUG': False, 'ENV_NAME': 'testing', 'PAGE_SIZE': 20, 'SECRET_KEY': 'test-secret', 'SESSION_COOKIE_SECURE': False, 'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:', 'TESTING': True}
  production   {'DEBUG': False, 'ENV_NAME': 'production', 'PAGE_SIZE': 20, 'SECRET_KEY': 'prod-secret-from-env', 'SESSION_COOKIE_SECURE': True, 'SQLALCHEMY_DATABASE_URI': 'sqlite:///app.db', 'TESTING': False}

上一篇:环境变量配置;下一篇:Application Factory。

fail fast

实测 · 本机执行输出
  没有 SECRET_KEY 的 production → RuntimeError: 生产配置缺少: ['SECRET_KEY']
  development 在没有环境变量时用 dev-only-secret: dev-only-secret
  没有 SECRET_KEY 也不报错的默认行为(没有 validate): 访问写 session 的视图 → 500 (没有 SECRET_KEY 时写 session 抛 RuntimeError,在生产里就是 500)

TESTING 的变化

实测 · 本机执行输出
  production  GET /boom → 500
  testing     GET /boom → 异常传出 ValueError(boom)
  app.testing 属性与 config["TESTING"] 是同一个: True True

Secure cookie

实测 · 本机执行输出
  development  Set-Cookie 带 Secure: False | session=eyJ4IjoxfQ.ar8ptw.QA_5M8cJrxBF-g-4GeCGYsj9P9o; HttpOnly; Path=
  production   Set-Cookie 带 Secure: True | session=eyJ4IjoxfQ.ar8ptw.QA_5M8cJrxBF-g-4GeCGYsj9P9o; Secure; HttpOnl

用环境变量切换

实测 · 本机执行输出
  APP_ENV=development  gunicorn "app:create_app()" → ENV_NAME=development DEBUG=True SESSION_COOKIE_SECURE=False
  APP_ENV=production   gunicorn "app:create_app()" → ENV_NAME=production DEBUG=False SESSION_COOKIE_SECURE=True
  flask --app 'app:create_app("testing")' run → ENV_NAME=testing TESTING=True

DEBUG 的启动检查

实测 · 本机执行输出
  检查结果: 生产环境不允许 DEBUG=True

分步演示

多环境配置
本步的对象

    本文用到的工具与边界

    • 本机 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,数字每次运行会有小幅抖动
    • 没有验证:配置类里的 @property 与 from_object 的交互、多个配置类的混入(Mixin)、真实 HTTPS 下 Secure cookie 的浏览器行为(见第 120 篇)、把配置做成 dataclass 或 pydantic-settings 的写法
    京ICP备2026067502号-1京公网安备11010502063487号