[SIP-24] Proposal to introduce Flask app factory pattern
See original GitHub issueMotivation
Superset’s singletons are currently configured in the superset
package’s __init__.py
python module which means that the app itself (Superset) cannot be configured any other way than is described in the root package. The act of simply importing superset
for other purposes, such as the cli
forces the entire app to load, even though all you might need is SqlAlchemy, or some other component. A better approach is to leverage a pattern such as the “Factory Pattern” in which one or more functions can compose several components into a single “app”. What’s more is that certain portions of the app might need to be overridden in test, or for different use cases. Making the app more composable makes it easier to alter functionality as needed and customize.
Proposed Change
In order to get this done, we will need to add a few new modules, clean up superset.__init__.py
and update the way views are added to FAB. This change is largely a refactor, with no change to functionality.
We should perform this migration in a few phases (likely several PRs):
1. Migrate all current direct references to app
to leverage flask.current_app
proxy
2. Introduce a new extensions.py
in the base of the superset
package whose job it will be to instantiate the Flask app, and other singletons, such as AppBuilder.
3. Move all logic currently in superset.__init__.py
into a new app.py
file which will define a create_app()
function whose responsibility will be to call init_app()
on the Flask app, along with other flask app aware objects
4. Move all calls to appbuilder.add_view_xxx()
to app.py
New or Changed Public Interfaces
The biggest change will be the removal of superset.app
from the global scope. Instead, we will leverage Flask’s current_app
proxy in order to reference the current running app. There will be no changes to the set of dependent libraries.
New dependencies
n/a
Migration Plan and Compatibility
Documentation will likely need to be added which describes the “new way” of doing things once this is merged into master
. Contributors that are accustomed to the current structure will likely need to spend a little time coming up to speed with the location of various parts.
Rejected Alternatives
n/a
Issue Analytics
- State:
- Created 4 years ago
- Comments:12 (10 by maintainers)
Top GitHub Comments
@craig-rueda I believe if you add the following in
app.py
,then having
FLASK_APP="superset.app"
should still work.+1!
Note: FAB still has some intricacies around using the factory pattern, for instance, as single security manager can be used across all generated apps.
Based on SIP-0, I think you’re supposed to start a
[DISCUSS]
thread on the mailing list that points to this issueAlso I think this should help with the looming circular dependencies we’ve been dealing with.