必须用类继承+环境变量驱动配置,通过FLASK_CONFIG指向配置类路径实现多环境自动切换,扩展需延迟初始化,蓝图注册须在create_app内完成,敏感字段强制从环境变量读取。

必须用类继承 + 环境变量驱动配置,否则多环境切换就是纸面功夫。 直接在 app.py 里写 app.config['DEBUG'] = True 或硬编码数据库 URL,上线前改来改去,漏一处就炸。工厂模式不是加个 create_app() 就完事,核心是让配置能“自动长出环境差异”,而不是靠人肉判断。
为什么 FLASK_ENV 不能直接当配置名用
Flask 2.3+ 推荐读 FLASK_ENV,但它只接受 development、testing、production 三个固定值,而你实际需要的可能是 staging、ci 甚至 local-docker。硬套会导致配置类映射失败或 fallback 到错误环境。
- 正确做法是:用
FLASK_CONFIG环境变量指向完整类路径,比如config.StagingConfig -
create_app()内部不写死if config_name == 'dev',而是直接app.config.from_object(config_name) - 若
FLASK_CONFIG未设,再 fallback 到os.getenv('FLASK_ENV', 'production'),并映射到预定义字典:{'development': DevelopmentConfig, ...} - 别在配置类里调用
super().__init__()——Config是纯数据类,没父类构造逻辑;漏写反而可能覆盖基类字段
SQLAlchemy 初始化顺序错了会报 RuntimeError
典型错误是把 db = SQLAlchemy(app) 写在模块顶层,或者在 create_app() 外就调用 db.init_app(app)。这会让扩展提前绑定上下文,导致测试时 RuntimeError: working outside of application context 或多个测试用例共享同一个 db 实例。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 所有扩展必须声明为“未绑定”状态:
db = SQLAlchemy()、migrate = Migrate()、login_manager = LoginManager() - 只在
create_app()函数体内、app创建之后,才依次调用db.init_app(app)、migrate.init_app(app, db) - 如果用了
flask-migrate,命令行flask db init必须在FLASK_APP="app:create_app()"环境下运行,括号不能省——否则找不到工厂函数 - 模型文件(如
models.py)里只能继承db.Model,不能调用db.create_all()或访问current_app
蓝图注册时机不对会触发循环导入
最常见的循环链是:app/__init__.py → 导入 routes.py → routes.py 导入 models.py → models.py 导入 db → db 又依赖 app 初始化。工厂模式破局点不在“怎么拆”,而在“谁先动”。
- 蓝图注册必须放在
create_app()函数内部,且在app.config.from_object()之后、return app之前 -
routes.py不应导入app,改用from flask import current_app或上下文感知方式(如g)获取资源 - 避免在蓝图模块顶部执行耗时操作(如连接 Redis),这些应延迟到第一次请求或单独初始化函数中
- 若用字符串路径注册蓝图(
app.register_blueprint('auth:bp', url_prefix='/auth')),需确保该路径可被 Python 导入,且模块内无顶层副作用代码
最易被忽略的是配置类里的敏感字段处理——SECRET_KEY 和数据库密码绝不能有默认字符串,哪怕只是 'dev-key'。一旦进 Git 历史,删都删不干净。必须强制从环境变量读取:os.environ['SECRET_KEY'],启动失败也比泄露强。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










