35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
"""
|
||
应用工厂模块(Application Factory Pattern)
|
||
- 延迟创建 Flask 实例,支持测试时传入不同配置
|
||
- 扩展对象在模块顶层创建但不绑定 app,通过 init_app() 延迟绑定
|
||
- 这种模式是 Flask 官方推荐的最佳实践,避免循环导入
|
||
"""
|
||
from flask import Flask
|
||
from flask_sqlalchemy import SQLAlchemy
|
||
from flask_migrate import Migrate
|
||
from app.config import Config
|
||
|
||
# ✅ 扩展实例在工厂外部创建,不与任何 app 绑定
|
||
# 这样可以在测试中创建多个 app 实例共享同一套扩展
|
||
db = SQLAlchemy()
|
||
migrate = Migrate()
|
||
|
||
|
||
def create_app(config_class=Config):
|
||
"""
|
||
应用工厂函数
|
||
:param config_class: 配置类,默认使用 Config,测试时可替换为 TestingConfig
|
||
:return: 配置完成的 Flask 应用实例
|
||
"""
|
||
app = Flask(__name__)
|
||
app.config.from_object(config_class)
|
||
|
||
# 将扩展绑定到当前 app 实例
|
||
db.init_app(app)
|
||
migrate.init_app(app, db)
|
||
|
||
# 注册蓝图(放在这里避免循环导入:蓝图引用 db → db 在工厂中初始化)
|
||
from app.routes.user import user_bp
|
||
app.register_blueprint(user_bp, url_prefix='/api/users')
|
||
|
||
return app |