Apache Superset中的蓝图

时间:2018-08-09 22:27:43

标签: flask superset apache-superset

我正在尝试扩展/修改Superset。我的目标是在“列表列”选项卡中添加“编辑表”表单的修改版本以及其他属性。当前有[列,详细名称,类型,可分组,可过滤,是临时的]。我想添加更多,例如“是目标”,“是预测变量”等。

Superset Edit Table

我不确定执行此操作的最佳方法。

我认为尝试使用Flask Blueprints是可行的方法,但是文档中只有一个非常基本的“ hello world”类型示例:

from flask import Blueprint
simple_page = Blueprint('simple_page', __name__,
                        template_folder='templates',
                        url_prefix='/simple_page')
@simple_page.route('/', defaults={'page': 'index'})
@simple_page.route('/<page>')
def show(page):
    return "Ok"

我如何设置蓝图以继承Superset中的几乎所有内容,但添加该表单的修改版本以及必要的修改,以将新列保存到数据库中?

我试图避免派生和创建自己的Superset修改版本,因为那样很难维护。

1 个答案:

答案 0 :(得分:1)

不确定这是否是您需要的,但是我认为我的回答可以节省某人的时间并得出一些结论,因为网上几乎没有示例。我的示例是什么: 1)将自定义下拉列表添加到主菜单 2)更改列编辑字段。

我发现hook提供了在应用运行时执行某些操作的可能性。 我还发现您的情况TableModelView有效。但是columns tab使用TableColumnInlineView可以工作。项目结构:

├── superset_config.py
├── templates
│   ├── example.html

superset_config.py 在运行应用程序时自动运行:

from flask import Blueprint, render_template, g, redirect
from flask_appbuilder import has_access


def flask_app_mutator(app):
    # my version of superset v0.29
    # be careful with imports! they are should be inside functions!
    # in other case config will not work
    from superset import appbuilder
    from superset.connectors.sqla.views import TableModelView, TableColumnInlineView
    # found our view and change something...
    for v in appbuilder.baseviews:
        if isinstance(v, TableModelView):
            table_columns = v.related_views[0]  # type: TableColumnInlineView
            table_columns.edit_columns = ['column_name', 'type']
    # add a new menu item
    appbuilder.add_link(
        'example',
        label='example',
        href='/example',
        category_icon='fa-file-text-o',
        category='Example')

# register our mutator - he will be called when app run
FLASK_APP_MUTATOR = flask_app_mutator

# just a new blue print for processing new menu item
example_bp = Blueprint(
    'example',
    __name__,
    template_folder='templates',
    static_url_path='/static/report')


@example_bp.route('/example')
def example():
    # as I wrote above - be careful with imports...
    from superset import appbuilder
    if not g.user or not g.user.get_id():
        return redirect(appbuilder.get_url_for_login)

    return render_template('example.html', appbuilder=appbuilder)


BLUEPRINTS = [example_bp]

从存储 superset_config.py 的目录中运行我们的应用程序,登录并打开一些表进行编辑(例如:http://0.0.0.0:8088/tablemodelview/edit/1)。您将看到我们视图的字段已更改+新菜单项:

edit columns

如果打开菜单项(或superset),您将看到http://0.0.0.0:8088/example的基本布局: custom page

example.html

{% extends 'superset/basic.html' %}

{% block body %}
<div>Hello world</div>
{% endblock %}
{% block tail_js %}
    {{ super() }}
    <script type="text/javascript" src="{{ url_for('static', filename='appbuilder/js/jquery-latest.js') }}"></script>
    <script type="text/javascript" src="{{ url_for('static', filename='appbuilder/js/bootstrap.min.js') }}"></script>
{% endblock %}

但是我确定自定义很耗时。某些组件可以使用builded js packages使用。我不能保证UI在mods之后可以正常工作。

无论如何,我希望这会对某人有所帮助。