Superset源码阅读(TODO)

我的Superset源码阅读笔记

版本

Superset 1.3.2

一、技术框架

搭建环境参考Apache Superset二次开发环境配置

Superset使用到的技术框架:

  • 前端采用 ,D3
    React:为数据提供渲染为HTML视图的开源JavaScript 库
    jinja Python 模板语言,渲染html用的
    D3:数据可视化javascript库

  • spuerset 后端采用Flask及Flask其他插件:Flask-AppBuilder、Sqlachermy,celery,pandas
    Flask Python微型web框架
    Flask-AppBuilder : 登录验证,权限控制。
    Flask-Login 登录
    Flask-WTF 表单校验
    sqlachermy: 数据引擎,连接DB
    pandas:数据处理
    celery:定时异步任务

二、目录结构

1 整体目录结构

打开gitbash

# 进入项目根目录
cd $SUPERSET_HOME
# 查看当前目录内容,为了方便查看删掉了一些多余内容
$ ls -la
total 1427
.
..
.asf.yaml
.codecov.yml
.dockerignore
.editorconfig
.flaskenv
.fossa.yml
.git
.github
.gitignore
.gitmodules
.idea
.pre-commit-config.yaml
.pylintrc
.rat-excludes
CHANGELOG.md
CODE_OF_CONDUCT.md
CONTRIBUTING.md
Dockerfile
INSTALL.md
LICENSE.txt
MANIFEST.in
Makefile
NOTICE
README.md
RELEASING
RESOURCES
UPDATING.md
apache_superset.egg-info
docker
docker-compose-non-dev.yml
docker-compose.yml
docs
helm
lintconf.yaml
pytest.ini
requirements
scripts
setup.cfg
setup.py
start.py
superset # 后端项目所在目录
superset-frontend # 前端项目所在目录
superset-websocket
tests
tox.ini
venv

2 前端目录结构

# 进入前端目录
cd $SUPERSET_HOME/superset-frontend
# 查看前端目录结构
$ ls -la
total 4379
.
..
.eslintignore
.eslintrc.js
.gitignore
.idea
.nvmrc
.storybook
babel.config.js
cypress-base
cypress_build.sh
images
jest.config.js
js_build.sh
jsconfig.json
node_modules
package-lock.json
package.json
prettier.config.js
spec
src # 前端重要文件
stylesheets
tsconfig.json
webpack.config.js # 前端入口文件
webpack.proxy-config.js

3 后端目录结构

# 进入后端目录
cd $SUPERSET_HOME/superset
# 查看后端目录结构
$ ls -la
total 436
.
..
__init__.py
__pycache__
annotation_layers
app 
app.py # 后端服务启动入口
async_events
cachekeys
charts # 图表相关接口
cli.py
commands
common
config.py # 配置文件
connectors # 连接器
constants.py # 静态变量
css_templates
dao # 公共的增删改查实现
dashboards # 仪表盘相关接口
databases # 数据库相关接口
dataframe.py 
datasets # 数据集(表)相关接口
db_engine_specs # 数据源兼容
db_engines
errors.py
examples # 示例
exceptions.py
extensions.py
forms.py # 表单
initialization
jinja_context.py
legacy.py
migrations # 升级相关实现
models # 数据库模型
queries # 查询相关实现
reports
result_set.py
schemas.py
security # 用户和权限相关实现
sql_lab.py
sql_parse.py
sql_validators
sqllab
static # 静态资源
stats_logger.py
tasks
templates # 页面模板
translations # 语言本地化
typing.py
utils
views # 视图层
viz.py # 所有可视化的基类

三、源码流程

一般流程

  1. 页面发起请求
  2. 如果需要表单才能完成的功能,先请求表单;再提交表单
  3. 如果不需要表单,请求后台接口

1 登录

  1. 后台服务启动
  2. 浏览器访问http://localhost:3000/实际访问的是flask_appbuilder/templates/appbuilder/index.html
  3. index.html调用的是superset/views/core.py里的welcome方法,这里可能是判断未登录,所以重定向到了login
  4. welcome 调用 http://localhost:3000/login/接口
  5. 默认是db方式,所以调用的是flask_appbuilder/security/views.py里的AuthDBView的login方法获取登录表单,这个login是get请求
  6. login返回登录表单,填写用户名密码,还是调用login,这次是post
  7. 重定向到http://localhost:3000/

2 注册

默认未开启注册,添加配置后才可注册

开启注册功能的配置

在superset项目根目录的config.py中修改或添加如下配置项

AUTH_TYPE = 1 # Database Authentication
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = 'Public'
# Config for Flask-WTF Recaptcha necessary for user registration
RECAPTCHA_PUBLIC_KEY = 'GOOGLE PUBLIC KEY FOR RECAPTCHA'
RECAPTCHA_PRIVATE_KEY = 'GOOGLE PRIVATE KEY FOR RECAPTCHA'
# Config for Flask-Mail necessary for user registration
MAIL_SERVER = 'smtp.gmail.com'
MAIL_USE_TLS = True
MAIL_USERNAME = 'yourappemail@gmail.com'
MAIL_PASSWORD = 'passwordformail'
MAIL_DEFAULT_SENDER = 'fabtest10@gmail.com'

流程:

  1. 打开superset登录界面,点击REGISTER,请求的url为http://localhost:3000/register/form
  2. form调用的是flask_appbuilder/security/registerviews.py的RegisterUserDBView的form_get方法
  3. 填完用户名密码等,点击注册调用的是flask_appbuilder/security/registerviews.py的RegisterUserDBView的form_post方法
  4. 注册完成重定向到http://localhost:3000/login/登录页面

3 查询所有Dashboard

  1. 接口url:http://localhost:3000/api/v1/dashboard/
  2. 看日志请求的是DashboardRestApi.get_list,DashboardRestApi没有get_list方法,找父类BaseSupersetModelRestApi
  3. BaseSupersetModelRestApi也没有,不过继承了flask_appbuilder的ModelRestApi
  4. 果然在ModelRestApi里找到了get_list方法,而get_list最终调用了get_list_headless方法

4 显示导航栏流程

  1. 访问登录页面http://localhost:3000/login/,填入用户名密码,点击登录
  2. 调用的是superset/views/core.py里的welcome方法,welcome返回superset/spa.html

导航栏分为左和右两个部分,我们关注的是左边的
在这里插入图片描述
在superset/spa.html里找了一下未发现和navbar相关的东西

不过spa.html继承了basic.html
在这里插入图片描述

  1. basic.html又include了appbuilder/navbar.html
    在这里插入图片描述
    到这里线索断了

建议

读superset源码时,一定要结合Flask Appbuilder官方文档一起读,superset官方文档没提到的内容基本上都可以在Flask Appbuilder官方文档里找到

参考资料

superset 开发环境搭建

Superset Github

Superset Documentation

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Superset源码目录结构如下所示: - `superset`: 根目录,包含了 Superset 的核心代码和配置文件。 - `assets`: 包含前端资源文件,如 JavaScript、CSS、图像等。 - `connectors`: 包含了数据库连接器的代码,用于与不同类型的数据源进行连接和查询。 - `datasets`: 包含了数据集相关的代码,用于管理和操作数据集。 - `db_migration`: 包含数据库迁移相关的代码,用于管理数据库的版本和结构变化。 - `security`: 包含了安全认证和权限管理相关的代码。 - `sql_lab`: 包含了 SQL 实验室的代码,用于执行和管理 SQL 查询。 - `templates`: 包含了模板文件,用于生成用户界面的 HTML 页面。 - `utils`: 包含了一些通用的工具函数和类。 - `views`: 包含了视图函数和路由配置,用于处理用户请求和生成响应。 - `__init__.py`: 初始化文件,定义了 Superset 的入口和全局配置。 - `config.py`: 配置文件,包含了 Superset 的各种配置选项。 - `tests`: 包含了测试代码和测试数据,用于对 Superset 进行单元测试和集成测试。 - `docs`: 包含了文档和帮助文件,用于说明 Superset 的安装、配置和使用方法。 - `examples`: 包含了示例代码和示例数据,用于演示 Superset 的功能和用法。 - `requirements.txt`: 定义了 Superset 的依赖库和版本要求。 - `setup.py`: 安装文件,用于安装和部署 Superset。 这只是 Superset 的一些核心目录和文件,实际上还有其他一些文件和目录用于支持插件、扩展和配置。Superset源码目录结构设计合理,模块化程度高,使得开发者可以方便地理解和扩展 Superset 的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值