概要
- 什么是flask_appbuilder?
- 什么是superset?
- Web实现框架
- 蓝图(Blueprint)的概念
- superset对flask_appbuilder的封装细节体现
1.什么是flask_appbuilder?
- flask_appbuilder是flask的扩展,便于迅速搭建一个Web应用(带有强大的用户权限管理能力,高度配置化应用)
2.什么是superset?
- superset可以看做flask_appbuilder的一层封装,经过封装后,�web开发人员能够高效实现数据可视化。
3.Web实现框架
结合superset代码,从MVC�角度看:
- Model,依靠SQLAlchemy(强大且流行的ORM)
- View,很重(含大量业务逻辑,由于有封装好的很多基类,所以代码量其实不大)
- Controller,很轻(几乎仅仅用于路由)
以Menu中的Slice为例,看其简要代码:
superset/models/core.py (Model层)
class Slice(Model, AuditMixinNullable, ImportMixin):
"""A slice is essentially a report or a view on data"""
__tablename__ = 'slices'
id = Column(Integer, primary_key=True)
slice_name = Column(String(250))
... # 表相应的字段,及相关方法属性
superset/views/core.py (View层)
class SliceModelView(SupersetModelView, DeleteMixin): # noqa
datamodel = SQLAInterface(models.Slice)
list_title = _('List Charts')
show_title = _('Show Chart')
add_title = _('Add Chart')
edit_title = _('Edit Chart')
can_add = False
label_columns = {
'datasource_link': _('Datasource'),
}
... # 各种对父类属性的重写
appbuilder.add_view(
SliceModelView,
'Charts',
label=__('Charts'),
icon='fa-bar-chart',
category='',
category_icon='')
由于superset的处理,Slice会隐含有list,show,edit,delete等相应的关联处理(也就是Control层),业务开发人员需要根据需求做改动即可。
4.蓝图(Blueprint)的概念
蓝图是flask中的概念,通过蓝图实现在一个应用中构建应用组件以及支持通用模式。
如上图所示,main和auth就是通过蓝图来实现模块的划分,这样开发者可以便于开发各自的模块。
应用Blueprint简要示例代码
from flask import Blueprint
main = Blueprint('main', __name__)
app.registrer_blueprint(main)
@main.route('/', methods=['GET', 'POST'])
def index():
pass
superset/connectors/sqla的底层应该就是用到了蓝图的概念。
业务上对应数据源头的相关内容的CRUD操作显示。
5.superset对flask_appbuilder的封装细节体现
- 关于config
superset/config.py就是flask_appbuilder中所说的configuration,高度配置化。(配置项有数据库地址,数据库访问超时设置等) - 关于has_access
观察源码会发现,superset/utils.py中定义的has_access与flask_appbuilder.security.decorators中定义的核心区别在于,superset加了一段代码:
elif g.user and g.user.get_id() and g.user.is_authenticated():
return redirect('/apply_permissions')
这样强化了建权的控制。
- ...
参考文档:
http://flask-appbuilder.readthedocs.io/en/latest/quickfiles.html
https://www.jianshu.com/p/95b584e4f76e