This is an automated email from the ASF dual-hosted git repository.
amitmiran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new cd0e03a chore: encapsulate flask app into superset app (#15281)
cd0e03a is described below
commit cd0e03a57f96529b3069815dbbae5e766e7a4444
Author: ofekisr <[email protected]>
AuthorDate: Mon Jun 21 16:05:05 2021 +0300
chore: encapsulate flask app into superset app (#15281)
---
superset/app.py | 6 +++-
superset/initialization/__init__.py | 70 ++++++++++++++++++++-----------------
2 files changed, 42 insertions(+), 34 deletions(-)
diff --git a/superset/app.py b/superset/app.py
index 2d89ffa..48883a9 100644
--- a/superset/app.py
+++ b/superset/app.py
@@ -26,7 +26,7 @@ logger = logging.getLogger(__name__)
def create_app() -> Flask:
- app = Flask(__name__)
+ app = SupersetApp(__name__)
try:
# Allow user to override our config completely
@@ -42,3 +42,7 @@ def create_app() -> Flask:
except Exception as ex:
logger.exception("Failed to create app")
raise ex
+
+
+class SupersetApp(Flask):
+ pass
diff --git a/superset/initialization/__init__.py
b/superset/initialization/__init__.py
index 0171b17..2654590 100644
--- a/superset/initialization/__init__.py
+++ b/superset/initialization/__init__.py
@@ -14,10 +14,11 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+from __future__ import annotations
import logging
import os
-from typing import Any, Callable, Dict
+from typing import Any, Callable, Dict, TYPE_CHECKING
import wtforms_json
from flask import Flask, redirect
@@ -48,15 +49,18 @@ from superset.typing import FlaskResponse
from superset.utils.core import pessimistic_connection_handling
from superset.utils.log import DBEventLogger, get_event_logger_from_cfg_value
+if TYPE_CHECKING:
+ from superset.app import SupersetApp
+
logger = logging.getLogger(__name__)
# pylint: disable=R0904
class SupersetAppInitializer:
- def __init__(self, app: Flask) -> None:
+ def __init__(self, app: SupersetApp) -> None:
super().__init__()
- self.flask_app = app
+ self.superset_app = app
self.config = app.config
self.manifest: Dict[Any, Any] = {}
@@ -77,7 +81,7 @@ class SupersetAppInitializer:
def configure_celery(self) -> None:
celery_app.config_from_object(self.config["CELERY_CONFIG"])
celery_app.set_default()
- flask_app = self.flask_app
+ superset_app = self.superset_app
# Here, we want to ensure that every call into Celery task has an app
context
# setup properly
@@ -89,7 +93,7 @@ class SupersetAppInitializer:
# Grab each call into the task and set up an app context
def __call__(self, *args: Any, **kwargs: Any) -> Any:
- with flask_app.app_context(): # type: ignore
+ with superset_app.app_context(): # type: ignore
return task_base.__call__(self, *args, **kwargs)
celery_app.Task = AppContextTask
@@ -538,7 +542,7 @@ class SupersetAppInitializer:
# after initialization
flask_app_mutator = self.config["FLASK_APP_MUTATOR"]
if flask_app_mutator:
- flask_app_mutator(self.flask_app)
+ flask_app_mutator(self.superset_app)
self.init_views()
@@ -563,17 +567,17 @@ class SupersetAppInitializer:
self.configure_middlewares()
self.configure_cache()
- with self.flask_app.app_context(): # type: ignore
+ with self.superset_app.app_context(): # type: ignore
self.init_app_in_ctx()
self.post_init()
def configure_auth_provider(self) -> None:
- machine_auth_provider_factory.init_app(self.flask_app)
+ machine_auth_provider_factory.init_app(self.superset_app)
def setup_event_logger(self) -> None:
_event_logger["event_logger"] = get_event_logger_from_cfg_value(
- self.flask_app.config.get("EVENT_LOGGER", DBEventLogger())
+ self.superset_app.config.get("EVENT_LOGGER", DBEventLogger())
)
def configure_data_sources(self) -> None:
@@ -583,11 +587,11 @@ class SupersetAppInitializer:
ConnectorRegistry.register_sources(module_datasource_map)
def configure_cache(self) -> None:
- cache_manager.init_app(self.flask_app)
- results_backend_manager.init_app(self.flask_app)
+ cache_manager.init_app(self.superset_app)
+ results_backend_manager.init_app(self.superset_app)
def configure_feature_flags(self) -> None:
- feature_flag_manager.init_app(self.flask_app)
+ feature_flag_manager.init_app(self.superset_app)
def configure_fab(self) -> None:
if self.config["SILENCE_FAB"]:
@@ -604,7 +608,7 @@ class SupersetAppInitializer:
appbuilder.indexview = SupersetIndexView
appbuilder.base_template = "superset/base.html"
appbuilder.security_manager_class = custom_sm
- appbuilder.init_app(self.flask_app, db.session)
+ appbuilder.init_app(self.superset_app, db.session)
def configure_url_map_converters(self) -> None:
#
@@ -616,20 +620,20 @@ class SupersetAppInitializer:
RegexConverter,
)
- self.flask_app.url_map.converters["regex"] = RegexConverter
- self.flask_app.url_map.converters["object_type"] = ObjectTypeConverter
+ self.superset_app.url_map.converters["regex"] = RegexConverter
+ self.superset_app.url_map.converters["object_type"] =
ObjectTypeConverter
def configure_middlewares(self) -> None:
if self.config["ENABLE_CORS"]:
from flask_cors import CORS
- CORS(self.flask_app, **self.config["CORS_OPTIONS"])
+ CORS(self.superset_app, **self.config["CORS_OPTIONS"])
if self.config["ENABLE_PROXY_FIX"]:
from werkzeug.middleware.proxy_fix import ProxyFix
- self.flask_app.wsgi_app = ProxyFix( # type: ignore
- self.flask_app.wsgi_app, **self.config["PROXY_FIX_CONFIG"]
+ self.superset_app.wsgi_app = ProxyFix( # type: ignore
+ self.superset_app.wsgi_app, **self.config["PROXY_FIX_CONFIG"]
)
if self.config["ENABLE_CHUNK_ENCODING"]:
@@ -647,8 +651,8 @@ class SupersetAppInitializer:
environ["wsgi.input_terminated"] = True
return self.app(environ, start_response)
- self.flask_app.wsgi_app = ChunkedEncodingFix( # type: ignore
- self.flask_app.wsgi_app # type: ignore
+ self.superset_app.wsgi_app = ChunkedEncodingFix( # type: ignore
+ self.superset_app.wsgi_app # type: ignore
)
if self.config["UPLOAD_FOLDER"]:
@@ -658,53 +662,53 @@ class SupersetAppInitializer:
pass
for middleware in self.config["ADDITIONAL_MIDDLEWARE"]:
- self.flask_app.wsgi_app = middleware( # type: ignore
- self.flask_app.wsgi_app
+ self.superset_app.wsgi_app = middleware( # type: ignore
+ self.superset_app.wsgi_app
)
# Flask-Compress
- Compress(self.flask_app)
+ Compress(self.superset_app)
if self.config["TALISMAN_ENABLED"]:
- talisman.init_app(self.flask_app, **self.config["TALISMAN_CONFIG"])
+ talisman.init_app(self.superset_app,
**self.config["TALISMAN_CONFIG"])
def configure_logging(self) -> None:
self.config["LOGGING_CONFIGURATOR"].configure_logging(
- self.config, self.flask_app.debug
+ self.config, self.superset_app.debug
)
def configure_db_encrypt(self) -> None:
- encrypted_field_factory.init_app(self.flask_app)
+ encrypted_field_factory.init_app(self.superset_app)
def setup_db(self) -> None:
- db.init_app(self.flask_app)
+ db.init_app(self.superset_app)
- with self.flask_app.app_context(): # type: ignore
+ with self.superset_app.app_context(): # type: ignore
pessimistic_connection_handling(db.engine)
- migrate.init_app(self.flask_app, db=db, directory=APP_DIR +
"/migrations")
+ migrate.init_app(self.superset_app, db=db, directory=APP_DIR +
"/migrations")
def configure_wtf(self) -> None:
if self.config["WTF_CSRF_ENABLED"]:
- csrf.init_app(self.flask_app)
+ csrf.init_app(self.superset_app)
csrf_exempt_list = self.config["WTF_CSRF_EXEMPT_LIST"]
for ex in csrf_exempt_list:
csrf.exempt(ex)
def configure_async_queries(self) -> None:
if feature_flag_manager.is_feature_enabled("GLOBAL_ASYNC_QUERIES"):
- async_query_manager.init_app(self.flask_app)
+ async_query_manager.init_app(self.superset_app)
def register_blueprints(self) -> None:
for bp in self.config["BLUEPRINTS"]:
try:
logger.info("Registering blueprint: %s", bp.name)
- self.flask_app.register_blueprint(bp)
+ self.superset_app.register_blueprint(bp)
except Exception: # pylint: disable=broad-except
logger.exception("blueprint registration failed")
def setup_bundle_manifest(self) -> None:
- manifest_processor.init_app(self.flask_app)
+ manifest_processor.init_app(self.superset_app)
class SupersetIndexView(IndexView):