Superset 如何启动的

对于Superset的启动,其本质上还是类似启动一个Flask框架

由于我们前两章已经讲过了如何初始化menu和api,在这一章之中,需要我们以启动Superset为脉络。将他们串联起来。

首先是启动相关代码,必然位于app.py下

是对应的create_app

def create_app() -> Flask:

app = SupersetApp(__name__)

try:

# Allow user to override our config completely

config_module = os.environ.get(“SUPERSET_CONFIG”, “superset.config”)

app.config.from_object(config_module)

app_initializer = app.config.get(“APP_INITIALIZER”, SupersetAppInitializer)(app)

app_initializer.init_app()

return app

# Make sure that bootstrap errors ALWAYS get logged

except Exception as ex:

logger.exception(“Failed to create app”)

raise ex

主要是在其中利用app_initializer调用 init_app函数

在init_app函数中,

def init_app(self) -> None:

“””
Main entry point which will delegate to other methods in
order to fully init the app
“””
self.pre_init()

self.check_secret_key()

# Configuration of logging must be done first to apply the formatter properly

self.configure_logging()

# Configuration of feature_flags must be done first to allow init features

# conditionally

self.configure_feature_flags()

self.configure_db_encrypt()

self.setup_db()

self.configure_celery()

self.enable_profiling()

self.setup_event_logger()

self.setup_bundle_manifest()

self.register_blueprints()

self.configure_wtf()

self.configure_middlewares()

self.configure_cache()

with self.superset_app.app_context():

self.init_app_in_ctx()

self.post_init()

在其中,分别进行了日志对象的创建,数据库的配置,定时任务的配置

最后调用init_app_in_ctx

def init_app_in_ctx(self) -> None:

“””
Runs init logic in the context of the app
“””
self.configure_fab()

self.configure_url_map_converters()

self.configure_data_sources()

self.configure_auth_provider()

self.configure_async_queries()

self.configure_ssh_manager()

self.configure_stats_manager()

# Hook that provides administrators a handle on the Flask APP

# after initialization

flask_app_mutator = self.config[“FLASK_APP_MUTATOR”]

if flask_app_mutator:

flask_app_mutator(self.superset_app)

if feature_flag_manager.is_feature_enabled(“TAGGING_SYSTEM”):

register_sqla_event_listeners()

self.init_views()

在这里面,实现对app的核心框架的组装。

首先是configure_fab,在其中,查看用户是否有自己提供的security_manager吗,如果提供了自定义安全认证器,那么就使用提供的,

并且在最后,调用了appbuilder的init_app函数来初始化app

def configure_fab(self) -> None:

if self.config[“SILENCE_FAB”]:

logging.getLogger(“flask_appbuilder”).setLevel(logging.ERROR)

custom_sm = self.config[“CUSTOM_SECURITY_MANAGER”] or SupersetSecurityManager

if not issubclass(custom_sm, SupersetSecurityManager):

raise Exception(

“””Your CUSTOM_SECURITY_MANAGER must now extend SupersetSecurityManager,

not FAB’s security manager.

See [4565] in UPDATING.md”””

)

appbuilder.indexview = SupersetIndexView

appbuilder.base_template = “superset/base.html”

appbuilder.security_manager_class = custom_sm

appbuilder.init_app(self.superset_app, db.session)

在init_app中,则是塞入了数据库连接,以及将menu等信息组装完成。

然后回到init_app_in_ctx之中,配置了url_map_converters之中

之后是配置sql alchemy相关的信息。

知道最后,利用self.init_views()对api和views进行组装。

直到这里,app完成了组装。

在返回了app对象之后,利用flask自带的run_command,进行了相关的启动。完成了启动工作。

发表评论

邮箱地址不会被公开。 必填项已用*标注