使用

以官方文档为主,各种配置说明比较详细:

创建您的第一个仪表板 |超集 — Creating Your First Dashboard | Superset (apache.org)

二次开发

采用<iframe>将superset前端内嵌到自己的项目中

  • <基于上一篇的环境配置>但是pypi安装使用的是已经编译过的前端没有可编译的superset-frontend目录

  • 前后端使用gh提供的源代码,后端与pypi代码一致,前端另外部署,前后端分离编译,详见配置开发环境,这里后端使用的是Flask server,配置有部分不同

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 首先python虚拟环境必须使用python3.9,3.10,3.11的版本
    sudo apt install python3.9 # os安装需要的python版本
    virtualenv superset-dev -python=pythonx.x.x # 生成环境
    source superset-dev/bin/activate # 激活环境

    git clone # 从需要从github上拉源码
    cd ./superset # 进入目录
    pip install -r requirements/development.txt # 安装外部依赖
    pip install -e . # 安装开发模组

    # 后面的初始化同PYPI部署一样
    superset db upgrade
    superset fab create-admin
    superset init
    superset load-examples
    superset run -p 8088 --with-threads --reload --debugger --debug # debug模式
  • 前端用npm i即可,有些包可能需要手动下载

  • 如果需求不止步于<iframe>,则需要针对源代码大量修改,官方文档相关内容较少

一、VMware网络配置(虚拟机设置/网络适配器/网络连接)

  1. 虚拟机如需连接主机代理需要自定义,也可以在虚拟机上配置

    可以网上检索“VMware虚拟机共享主机代理”相关内容

  2. 选择桥接模式

虚拟机终端下输入

1
ifconfig
ifconfig输出截图.png

可以看到这里内网的IP地址是192.168.188.97(不同局域网后两位不一样)

如果只有下面一段输出,可能是没连上网(确保主机联网),也可能是ubuntu网络服务掉了(解决见下)

先检查/var/lib/NetworkManager/NetworkManager.state

NetworkManager是一些Linux的默认网络管理器)

1
2
3
4
5
6
7
sudo cat /var/lib/NetworkManager/NetworkManager.state

# 输出
[main]
NetworkingEnabled=false
WirelessEnabled=true
WWANEnabled=true

文件中/输出中显示状态NetworkingEnabled=false,所以服务是关闭状态

1
2
3
4
5
6
7
8
# 关闭服务
service NetworkManager stop

# 删除状态文件
sudo rm /var/lib/NetworkManager/NetworkManager.state

# 重启服务
service NetworkManager start

一般到这步就好了

可以再修改以下配置文件/etc/NetworkManager/NetworkManager.conf

1
2
3
sudo vim /etc/NetworkManager/NetworkManager.conf

修改文件中的managed=true

一些debian版本NetworkManager 默认不管理任何定义的 /etc/network/interfaces 接口

未受管理的设备意味着 NetworkManager 不处理这些网络设备

/etc/NetworkManager/NetworkManager.conf中的[ifupdown]设置managed=true后,NetworkManager 会尝试管理 /etc/network/interfaces 中定义的接口

修改完后保存,输入

1
sudo systemctl restart systemd-networkd.service

重启网络服务就好了

二、superset部分配置项修改

配置超集 |超集 — Configuring Superset | Superset (apache.org)

已经在虚拟机中获得内网IP,需要略微修改运行superset的命令

1
2
3
4
# 如果先前的环境变量都配置了的话
# 以后重启虚拟机启用superset服务只需要进入虚拟环境
source superset/bin/activate
superset run -h 192.168.188.97 -p 8088 --with-threads --reload --debugger

就可以在虚拟机外部同局域网的主机下用浏览器访问192.168.188.97:8088的服务了

二次开发superset通过iframe嵌入是最方便的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>dashboard</title>
</head>
<body>
<div class-"dashboard">
<iframe
width="1600"
height="800"
seamless
frameBorder="0"
scrolling="no"
src="http://192.168.188.97:8088/">
</iframe>
</div>
</body>
</html>

用浏览器打开html就可以直接访问到嵌套在iframe里面的superset,但是可以会出现跨域等问题,所以需要进行一些配置

superset 通过其 config.py 模块公开了数百个可配置参数
进入superset/lib/pythonx.x/site-packages/superset/config.py

  1. 语言配置
1
BABEL_DAFAULT_LOCALE = "zh" # 改中文,下面有一个LANGUAGES的字典可以根据需要修改

如果希望在不用登录的状态下就能访问仪表板数据看板

  1. 角色权限管理

superset将分了几种默认角色权限

  • Admin管理员:默认所有权限
  • Public公共(未登陆):默认无权限
  • Alpha:能访问修改数据源
  • Gamma:能访问修改仪表盘和图表
  • granter:能修改角色权限
  • sql_lab:能访问SQL Lab

可以在管理员用户的Settings设置/List Roles 列出角色中修改,也可以通过config.py进行一些配置

逐项为public角色添加权限相当麻烦,所以修改config.p以下配置

1
2
3
4
5
PUBLIC_ROLE_LIKE: Optional[str] = None
# 改成
PUBLIC_ROLE_LIKE: Optional[str] = "Gamma" # 使public和Gamma权限一致
# 有些版本可能是
PUBLIC_ROLE_LIKE_GAMMA = True

当然一般可以给public添加一个数据源的权限

1
all database access on all_database_access
  1. 去掉X-Frame-Options限制

配置调用的优先级是先OVERRIDE_HTTP_HEADERS再DEFAULT_HTTP_HEADERS最后HTTP_HEADERS,反正三项置空就行

1
2
3
DEFAULT_HTTP_HEADERS: dict[str, Any] = {}
OVERRIDE_HTTP_HEADERS: dict[str, Any] = {}
HTTP_HEADERS: dict[str, Any] = {}
  1. CSRF 保护设置

默认情况下,WTF_CSRF_ENABLED 为 True

设为False禁用所有视图中的 CSRF 保护

1
WTF_CSRF_ENABLED = False 
  1. TALISMAN_ENABLED和TALISMAN_DEV_CONFIG的配置

    经过前面的配置一般来说iframe中可以显示superset,但是登录后遇到重定向问题,依旧回到原页面(未登录状态)

    F12发现“X-Frame-Options”为“SAMEORIGIN”

    github看到类似问题可能有助于解决

    1
    2
    3
    4
    5
    6
    TALISMAN_ENABLED = True
    TALISMAN_DEV_CONFIG = {
    ...
    "frame_options": 'ALLOWALL',
    'frame_options_allow_from': '*',
    }

    接着,如果superset服务与自己的应用服务在同一个域名下iframe中就可以正常登录

    假如自己的应用服务和superset服务不在同一个域名下,需要以下配置:

    1. superset_config.py中添加 SESSION_COOKIE_SAMESITE = 'None'
    2. 确保将 Firefox 设置为不阻止跨站点 cookie(不建议这样做,但它会制作嵌入式图表)。

    因此,从 /superset/welcome 重定向到 /login/ 意味着 superset 无法从 cookie 中找到您的会话(您的浏览器可能会阻止第 3 方 cookie,因为 superset 作为第 3 方提供)

    如果您通过 HTTP 而不是 HTTPS 提供超集,则还需要在 superset_config.py中使用 SESSION_COOKIE_SECURE = False,尽管不建议仅使用 http。

    注意:此解决方案适用于 Firefox 和 Chrome/Chromium,但不适用于 Safari。

    详见python - Superset iframe login redirect - Stack Overflow

  2. 其他

    1)

    1
    2
    3
    APP_NAME = "Superset" # 可更改标签页名称
    APP_ICON = "xxx.png" # 可修改界面左上角图标
    LOGO_TARGET_PATH = None # 可修改图标点击后的跳转页面

    2)

    浏览器进入192.168.xxx.xxx:8088地址默认会重定向到/superset/welcome/页面

    这个页面是superset/templates/superset/public_welcome.html

    templates里面内容是Flask生成的,html也是经过打包的

    在superset/initialization/init.py文件中有代码,就是用来重定向的

    1
    2
    3
    4
    class SupersetIndexView(IndexView):
    @expose("/")
    def index(self) -> FlaskResponse:
    return redirect("/superset/welcome/")

    例如可以将代码中”/superset/welcome/”改成”/dashboard/list/”就会重定向到仪表盘页面了

    3)

    JWT用户登陆验证,还没搞

    教程 —— 如何在自己的应用集成superset - JadePeng - 博客园

    https://github.com/ygoleite/superset-jwt-login

    4)

    遇到的一个数据库问题(无法获取数据库:解密密钥无效),通过下面连接方法解决

    https://github.com/apache/superset/issues/25261

    解决方案是在将文件 /home/YOUR_USER/superset-env/lib/pythonX.X.X/site-packages/sqlalchemy_utils/types/encrypted/encrypted_type.py 中找到的每个 utf-8 字符串更改为 latin-1 后,使用superset re-encrypt-secrets