有了flask-sqlalchemy
,有谁知道为什么http://pythonhosted.org/Flask-SQLAlchemy/api.html中的第二种构造方法也不建议db.app = app
?似乎第一种和第二种构造方法之间的主要区别只是第一种可以db.app = app
,而第二种可以db.app = None
谢谢!
有了flask-sqlalchemy
,有谁知道为什么http://pythonhosted.org/Flask-SQLAlchemy/api.html中的第二种构造方法也不建议db.app = app
?似乎第一种和第二种构造方法之间的主要区别只是第一种可以db.app = app
,而第二种可以db.app = None
谢谢!
这两种初始化方法对于 Flask 扩展来说是相当标准的,并且遵循关于如何初始化扩展的隐式约定。在Flask 文档的这一部分中,您可以找到解释它的注释:
正如您所注意到的,init_app 不会将 app 分配给 self。这是故意的!基于类的 Flask 扩展必须仅在将应用程序传递给构造函数时将应用程序存储在对象上。这告诉扩展:我对使用多个应用程序不感兴趣。
当扩展需要查找当前应用程序并且它没有对它的引用时,它必须使用本地的 current_app 上下文或以您可以显式传递应用程序的方式更改 API。
这个想法可以总结如下:
SQLAlchemy(app)
构造函数,则扩展将假定这app
是唯一的应用程序,因此它将对它的引用存储在self.app
.init_app(app)
构造函数,则扩展将假定它app
可能是许多应用程序之一。因此,它不会保存引用,而是在current_app
每次需要时定位应用程序。两种初始化扩展方式的实际区别在于,第一种格式要求应用程序存在,因为它必须在构造函数中传递。第二种格式允许在db
应用程序存在之前创建对象,因为您不向构造函数传递任何内容。在这种情况下,您将调用推迟db.init_app(app)
到您拥有应用程序实例。应用程序实例创建延迟的典型情况是使用应用程序工厂模式。