superset源码分析-视图函数

本文解析了Superset如何利用Flask-AppBuilder的BaseView类实现视图函数的注册。通过@expose装饰器标记的方法自动生成蓝图,并注册到Flask应用中,揭示了Superset视图注册的独特机制。

用过superset的人都知道,superset的视图函数继承flask-appbuilder的ModelView和BaseView。用过flask的人都知道,视图加入应用有2中方式,一种是route函数,一种是add_url_rule函数,可是在继承了BaseView的Superset类中,没有看到调用route或着add_url_rule函数来注册Superset类,但是Superset类的方法就可以被调用,原来在BaseView中,它把superset类中的带有@expose装饰器的方法生成蓝图,然后蓝图负责把方法注册到app中

 def create_blueprint(self, appbuilder,
                         endpoint=None,
                         static_folder=None):
        """
            Create Flask blueprint. You will generally not use it

            :param appbuilder:
               the AppBuilder object
            :param endpoint:
               endpoint override for this blueprint, will assume class name if not provided
            :param static_folder:
               the relative override for static folder, if omitted application will use the appbuilder static
        """
        # Store appbuilder instance
        self.appbuilder = appbuilder

        # If endpoint name is not provided, get it from the class name
        self.endpoint = endpoint or self.__class__.__name__

        if self.route_base is None:
            self.route_base = '/' + self.__class__.__name__.lower()

        self.static_folder = static_folder
        if not static_folder:
            # Create blueprint and register rules
            self.blueprint = Blueprint(self.endpoint, __name__,
                                       url_prefix=self.route_base,
                                       template_folder=self.template_folder)
        else:
            self.blueprint = Blueprint(self.endpoint, __name__,
                                       url_prefix=self.route_base,
                                       template_folder=self.template_folder,
                                       static_folder=static_folder)
        self._register_urls()
        return self.blueprint

    def _register_urls(self):
        for attr_name in dir(self):
            attr = getattr(self, attr_name)
            if hasattr(attr, '_urls'):
                for url, methods in attr._urls:
                    self.blueprint.add_url_rule(url,
                                                attr_name,
                                                attr,
                                                methods=methods)
gapinyc@DESKTOP-9QS7RL5:~/superset-prod$ docker compose down --volumes --remove-orphans [+] Running 7/7 ✔ Container superset-web Removed 0.0s ✔ Container superset-prod-superset-init-1 Removed 1.3s ✔ Container superset-prod-redis-1 Removed 0.3s ✔ Container superset-prod-mysql-1 Removed 1.0s ✔ Volume superset-prod_mysql_data Removed 0.0s ✔ Network superset-prod_superset-net Removed 0.4s ✔ Volume superset-prod_redis_data Removed 0.0s gapinyc@DESKTOP-9QS7RL5:~/superset-prod$ docker system prune -f Total reclaimed space: 0B gapinyc@DESKTOP-9QS7RL5:~/superset-prod$ docker compose down -v gapinyc@DESKTOP-9QS7RL5:~/superset-prod$ docker compose up -d [+] Running 7/7 ✔ Network superset-prod_superset-net Created 0.0s ✔ Volume superset-prod_mysql_data Created 0.0s ✔ Volume superset-prod_redis_data Created 0.0s ✔ Container superset-prod-redis-1 Healthy 6.0s ✔ Container superset-prod-mysql-1 Healthy 16.0s ✔ Container superset-prod-superset-init-1 Started 16.1s ✔ Container superset-web Started 16.2s gapinyc@DESKTOP-9QS7RL5:~/superset-prod$ docker logs -f superset-init Error response from daemon: No such container: superset-init gapinyc@DESKTOP-9QS7RL5:~/superset-prod$ docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS superset-prod-mysql-1 mysql:8.0 "docker-entrypoint.s…" mysql 40 seconds ago Up 39 seconds (healthy) 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp superset-prod-redis-1 redis:7-alpine "docker-entrypoint.s…" redis 40 seconds ago Up 39 seconds (healthy) 6379/tcp superset-prod-superset-init-1 apache/superset:latest "bash -c '\n echo '…" superset-init 40 seconds ago Up 24 seconds (health: starting) 8088/tcp superset-web apache/superset:latest "bash -c '\n pip ins…" superset 40 seconds ago Restarting (2) 3 seconds ago gapinyc@DESKTOP-9QS7RL5:~/superset-prod$ 没有成功,到底是哪里的问题导致的呢
最新发布
10-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值