用过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)