怎么让同一份代码在开发、测试、生产里有不同配置?哪些配置项必须区分?缺了关键配置会在什么时候才发现?这篇写三套配置并逐一验证。
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。
没有 SECRET_KEY 的 production → RuntimeError: 生产配置缺少: ['SECRET_KEY'] development 在没有环境变量时用 dev-only-secret: dev-only-secret 没有 SECRET_KEY 也不报错的默认行为(没有 validate): 访问写 session 的视图 → 500 (没有 SECRET_KEY 时写 session 抛 RuntimeError,在生产里就是 500)
production GET /boom → 500 testing GET /boom → 异常传出 ValueError(boom) app.testing 属性与 config["TESTING"] 是同一个: True True
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=True