Reputation: 6365
With flask-sqlalchemy
, does anyone know why the second approach of construction in http://pythonhosted.org/Flask-SQLAlchemy/api.html doesn't suggest db.app = app
as well? It seems the major difference between the first and second construction methods is simply that the first does db.app = app
whilst the second does db.app = None
Thanks!
Upvotes: 2
Views: 633
Reputation: 67502
The two methods of initialization are pretty standard for Flask extensions and follow an implicit convention on how extensions are to be initialized. In this section of the Flask documentation you can find a note that explains it:
As you noticed, init_app does not assign app to self. This is intentional! Class based Flask extensions must only store the application on the object when the application was passed to the constructor. This tells the extension: I am not interested in using multiple applications.
When the extension needs to find the current application and it does not have a reference to it, it must either use the current_app context local or change the API in a way that you can pass the application explicitly.
The idea can be summarized as follows:
SQLAlchemy(app)
constructor then the extension will assume that app
is the only application, so it will store a reference to it in self.app
.init_app(app)
constructor then the extension will assume that app
is one of possibly many applications. So instead of saving a reference it will rely on current_app
to locate the application every time it needs it.The practical difference between the two ways to initialize extensions is that the first format requires the application to exist, because it must be passed in the constructor. The second format allows the db
object to be created before the application exists because you pass nothing to the constructor. In this case you postpone the call to db.init_app(app)
until you have an application instance. The typical situation in which the creation of the application instance is delayed is if you use the application factory pattern.
Upvotes: 3