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:
“”” 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:
“”” 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,进行了相关的启动。完成了启动工作。