
本文详解 Flask 中应用工厂函数 create_app() 的工作原理与常见误用,帮助开发者正确初始化应用实例、避免导入错误,并实现可扩展、可测试的项目结构。
本文详解 flask 中应用工厂函数 `create_app()` 的工作原理与常见误用,帮助开发者正确初始化应用实例、避免导入错误,并实现可扩展、可测试的项目结构。
在 Flask 开发中,create_app() 是应用工厂模式(Application Factory)的核心函数,它将 Flask 应用的创建逻辑封装为可复用、可配置的函数,而非直接在模块顶层创建全局 app 实例。这种模式是构建大型、可测试、多环境(开发/测试/生产) Flask 项目的推荐实践。
但初学者常陷入两个典型误区:
✅ 误区一:定义了 create_app() 却未调用它
如问题中所示,__init__.py 内虽定义了 create_app(),但 run.py 仍尝试直接导入 app —— 而此时 app 只是一个模块级变量(且未在 create_app() 中被实际返回或赋值),导致 hello2 永远不会打印。
✅ 误区二:在 create_app() 内部创建 app,却试图从包外导入 app
若将 app = Flask(__name__) 移入 create_app() 函数体内,则 app 成为局部变量,模块顶层不再存在 app 对象,自然无法通过 from gg import app 导入,引发 ImportError。
✅ 正确实现方式(应用工厂模式)
目录结构须规范:
project/
├── run.py
└── gg/
├── __init__.py
└── ...gg/__init__.py(推荐写法):
from flask import Flask
def create_app():
app = Flask(__name__)
print("hello2") # ✅ 此行将在 create_app() 被调用时执行
# ? 可在此处注册蓝图、配置扩展、初始化数据库等
# from .views import main_bp
# app.register_blueprint(main_bp)
return app # ✅ 必须显式返回应用实例run.py(启动入口):
from gg import create_app
if __name__ == '__main__':
app = create_app() # ✅ 显式调用工厂函数获取 app 实例
app.run(host='127.0.0.1', port=5000, debug=True)运行 python run.py 后,控制台将输出 hello2,证明 create_app() 已被成功调用。
⚠️ 注意事项与最佳实践
- 不要在 __init__.py 中创建全局 app 实例:这会破坏工厂模式的灵活性,阻碍多实例、多配置场景(如测试时需独立应用实例)。
- 所有扩展初始化应延迟至 create_app() 内完成:例如 db.init_app(app)、login_manager.init_app(app),确保扩展绑定到当前应用上下文。
- 配置应通过参数或环境变量注入:def create_app(config_name='development'):,便于环境隔离。
- 避免循环导入:蓝图、模型等应在 create_app() 内按需导入并注册,而非在模块顶层导入 app。
掌握 create_app() 的正确用法,是迈向专业 Flask 工程化的关键一步——它让应用真正“按需创建”,为单元测试、蓝绿部署与微服务集成打下坚实基础。

















