Superset二次开发--添加新图例

superset安装和环境配置网上都有现成的例子,此处就不赘述了。不过还是顺便说下我是git clone的源码安装的。发布的版本是0.28.1 。运行系统为linux,Windows的话有一些坑,github或者别的博客都有说解决方法,我这里也不赘述了。

在二次开发部分,网上并没有太多新的内容。最简单来说,添加新的图。网上给的例子,在当前版本的superset中都已经不支持了,连项目目录结构都变了,根本不能用,除非退回到之前的版本。但是我想大家都不会想用老版本的。就连github上给的例子都是旧的。我在github上提出过希望他们发一个新的教程出来,不过开发者说他们正在开发这样的插件,反正也没更新例子。

废话到此为止,开始。

前置条件

为superset配置echarts。

在superset\superset\assets\packages.json中的“dependencies”中添加"echarts": "^4.2.0-rc.2"。版本号就用自己的echarts版本号。

然后打开命令行终端,在这个assets下执行

$ npm install -d
$ npm run dev

添加一个echarts图例

这里我直接给出添加一个图例需要哪些文件。后面会解释如何修改这些文件。

supserset/viz.py #修改
superset/assets/src/visualizations #添加
superset/static/assets/src/visualizations/presets/LegacyChartPreset.js #修改
\superset\assets\src\explore\controlPanels #添加
superset/assets/src/explore/controlPanels/index.js #修改
\superset\assets\src\explore\controls.jsx #可选项

这里举个非常简单易懂的栗子:添加一个echarts的散点图。 

一、修改viz.py文件

我们先来看一下最终效果页面:

viz.py 这个文件起到一个类似于视图的功能,从前端接受请求后进行一系列处理。我们可以看到,一个图例就是一个类。经过分析已有的这些类,发现这些类大部分是继承了BaseViz这个基类,并且主要重写了query_objget_data这两个方法。其中query_obj,顾名思义,是用来构造查询条件的。而查询条件来源于页面左侧的组件,这些组件的信息存储在form_data的一个字典中,query_obj方法中将会处理form_data,构造除自己需要的查询条件并返回࿰

### Superset 中实现 Cross-filtering 功能的二次开发 在 Apache Superset 中,通过自定义 JavaScript 和 Python 后端逻辑可以实现跨过滤(Cross-filtering)功能。此过程涉及前端和后端两部分的工作。 #### 前端修改 为了实现在不同图表之间共享筛选条件的功能,在前端需要监听特定事件并传播这些事件到其他组件。这通常涉及到对现有 React 组件树中的 `FilterBox` 或者任何用于输入筛选器值的小部件进行扩展[^1]: ```javascript // src/explore/components/controls/FiltersControl.jsx import React from 'react'; import PropTypes from 'prop-types'; class FiltersControl extends React.PureComponent { handleApplyFilters = () => { const { filters } = this.state; // 发布全局事件以便其他组件订阅 window.dispatchEvent( new CustomEvent('applyGlobalFilters', { detail: filters }) ); } render() { return ( <div> {/* 渲染过滤表单 */} <button onClick={this.handleApplyFilters}>应用</button> </div> ) } } export default FiltersControl; ``` 为了让其他可视化组件能够响应这个的全局事件,可以在各个视图组件内添加相应的侦听器: ```javascript componentDidMount() { window.addEventListener('applyGlobalFilters', this.onGlobalFiltersApplied); } onGlobalFiltersApplied(event) { const appliedFilters = event.detail; // 更当前组件的状态或者其他操作来反映设置好的过滤参数 this.setState({ ... }); } ``` #### 后端支持 对于某些复杂场景下可能还需要调整服务器端 API 来处理来自客户端的请求模式。例如当用户选择了多个维度作为联合查询条件时,则需确保 SQL 查询构建器能正确解析并执行多维联接查询[^2]: ```python from superset.connectors.sqla.models import SqlMetric, TableColumn from sqlalchemy.orm.session import Session as SASession def apply_cross_filters(query_obj, filter_values): """根据传入的交叉筛选条件动态修改SQLAlchemy ORM查询""" session: SASession for column_name, value_list in filter_values.items(): table_column: TableColumn = query_obj.datasource.get_column(column_name) if not table_column or not isinstance(value_list, list): continue # 构建IN子句 clause = table_column.column.in_(value_list) # 将条件附加到原始查询上 query_obj.having_criteria.append(clause) # 修改后的视图函数片段 @csrf.exempt @app.route('/api/v1/chart/<chart_id>/data') def get_chart_data(chart_id=None): ... cross_filter_params = request.args.getlist('crossFilters[]') try: parsed_filters = json.loads(cross_filter_params[0]) if cross_filter_params else {} apply_cross_filters(form.query_obj(), parsed_filters) except Exception as e: logging.error(f'Failed to parse cross-filters params: {e}') abort(400, "Invalid cross-filters parameters") result = form.get_df() ... return jsonify({'result': result}) ```
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值