使用flask-sqlalchemy
,是否有人知道为什么http://pythonhosted.org/Flask-SQLAlchemy/api.html中的第二种构造方法也不建议db.app = app
?看起来第一种和第二种构造方法之间的主要区别仅仅在于第一种构造方法db.app = app
而第二种方法构建db.app = None
谢谢!
答案 0 :(得分:3)
两种初始化方法对于Flask扩展非常标准,并遵循关于如何初始化扩展的隐式约定。在this section of the Flask documentation中,您可以找到解释它的注释:
正如您所注意到的,init_app不会将应用分配给自己。这是故意的!基于类的Flask扩展必须仅在将应用程序传递给构造函数时将应用程序存储在对象上。这告诉扩展名:我对使用多个应用程序不感兴趣。
当扩展需要查找当前应用程序并且它没有对它的引用时,它必须使用current_app context local或者以可以显式传递应用程序的方式更改API。
这个想法可归纳如下:
SQLAlchemy(app)
构造函数,则扩展程序会假定app
是唯一的应用程序,因此它会在self.app
中存储对它的引用。init_app(app)
构造函数,那么扩展程序将假定app
可能是许多应用程序之一。因此,它不是保存引用,而是依赖current_app
在每次需要时定位应用程序。初始化扩展的两种方法之间的实际区别在于第一种格式要求应用程序存在,因为它必须在构造函数中传递。第二种格式允许在应用程序存在之前创建db
对象,因为您没有向构造函数传递任何内容。在这种情况下,您将调用推迟到db.init_app(app)
,直到您有一个应用程序实例。创建应用程序实例的典型情况是使用application factory pattern。