Supersetデータ可視化レポートの二次開発
7440 ワード
Supersetの概要
SupersetはAirbnbオープンソースのデータ可視化ツールであり、Druid、Presto、Kylinなどのデータベースやクエリーエンジンにアクセスできる.豊富な可視化効果を提供し、TBレベルのデータ量検索をサポートする.SupersetはFlask-Appbuilderをバックエンドの開発フレームワークとして使用し、より柔軟なログイン、権限管理、viewなどのカスタマイズ機能を提供し、自分のシステムと二次開発を統合しやすい.Supersetは企業レポートの開発プロセスが煩雑で、権限管理が混乱している問題を解決した.
Supersetコード構造
githubからソースコードをダウンロードした後、フォルダを開くと、主なコードロジックは
superset
のパスの下にある.pipによってインストール場合、以下に示すように、実行可能ファイルが存在するパスwhich superset
を/usr/local/lib/python2.7/site-packages/superset
によって表示することができる.superset/bin
:このディレクトリの下のsuperset
ファイルはプログラムの実行入口superset/connectors
:supersetのいくつかのデータソース、tableのmodelとview superset/migration
:superset db schemaアップグレードとバージョン遷移を格納superset/models
:supersetを格納データベースモデル、supersetのコアロジック、例えばSlice、Dashboardはここで見つけることができる.superset/static
およびsuperset/templates
:supersetフロントエンド関連テンプレート、コントロールコードsuperset/views
:supersetのすべてのビューを配置し、Slice、DashboardとSQL Labに関する展示、クエリー、記憶、ダウンロードなどの機能についてこの中のソースコードを表示することができます.superset/__init__.py
:ここにはFlaskアプリ、Flask AppBuilder、SQLAlchemy、Security Managerの起動作業、supersetのビュー、データベース接続、安全管理などが含まれている.superset/config.py
のコードを読むことにより、自分で構成を変更する必要がある場合は、superset_config.py
のファイルを作成し、そのファイルのパスexportを環境変数SUPERSET_CONFIG_PATH
に入力.ログイン権限カスタム開発
Superset登録モジュールは、実はF.A.B(Flask-AppBuilderの略称)を用いた登録認証フレームワークである.次のログイン認証方法があります.
AUTH_TYPE value
description
0/AUTH_OID
Open IDの方式検証、例えばgmail、Twitter、FBサードパーティアプリを通じてすべてこの範疇に属します
1/AUTH_DB
ユーザー名パスワードでログインし、ログイン情報をデータベースに保存
2/AUTH_LDAP
LDAPプロトコルによるログイン許可については、興味のあるLDAPプロトコルを検索してください.
3/AUTH_REMOTE_USER
Webサーバから検証され、社内で統一的に使用できるログインシステム
4/AUTH_OAUTH
supersetはこの構成方法をサポートしていません
以上の詳細については、F.A.BのSecurityManagerソースコードを参照してください.
Supersetのソースコードを熟知すると、
superset/config.py
にAUTHENTICATION CONFIG構成がある、AUTH_TYPE
の値をsuperset_config.py
に書き、そのファイルのパスをsupersetに伝えることで、自分が修正したい構成をsupersetのソースコードの構成に置き換えることができる.自分で書いた構成情報を~/superset/conf/superset_config.py
に書きましたexport SUPERSET_CONFIG_PATH=~/superset/conf/superset_config.py
AUTH_REMOTE_USER開発
会社の日常生産において、登録モジュールは一般的に統一と安全を考慮するために、従業員の既存のメールボックスとパスワードを登録方式として使用する、すなわちremote server API(例えばメールボックス検証のAPI)を呼び出すことによって、ユーザーの認証情報を取得し、認証によってユーザー情報をdbに保存し、ユーザーのsessionが期限切れでなければ、次回は直接ウェブサイトにアクセスすることができる.すなわち、上述
AUTH_REMOTE_USER
の方式である.1.構成
まずはsuperset_config.pyで
CUSTOM_SECURITY_MANAGER
を構成し、supersetで使用するSecurityManagerを置き換える.次にMySecurityManager
クラスを書いてSecurityManagerを継承し、いくつかのviewと方法を書き直して自分の望むログイン効果をカスタマイズします.from flask_appbuilder.security.manager import AUTH_REMOTE_USER
from security.security_models import MySecurityManager
# using customize MY security manager
CUSTOM_SECURITY_MANAGER = MySecurityManager
# AUTHENTICATION CONFIG
# remote server
AUTH_TYPE = AUTH_REMOTE_USER
# setup Public role name, no authentication needed
AUTH_ROLE_PUBLIC = 'Gamma'
# Will allow user self registration
AUTH_USER_REGISTRATION = True
2.継承と書き換え
Flask-Appbuilderでセキュリティに関連するクラスを管理するのはSecurityManagerです.このクラスの説明の通りです.
Responsible for authentication, registering security views, role and permission auto management. If you want to change anything just inherit and override, then pass your own security manager to AppBuilder.
認証、セキュリティ関連のビューの登録、ロール、権限の自動化管理を担当します.だから開発の構想はしばしばその継承関係を明らかにして、どんなviewがあるかを見て、modelあるいは方法は書き換えることができて、それによって自分の望む効果を実現します.
この過程でauth_を重点的に見ましたremote_userに関する処理ロジックは、
authremoteuserview
のオブジェクトおよびloginの方法を書き換える.詳細表示コード:# -*- coding: utf-8 -*-
import logging
from flask_appbuilder.const import LOGMSG_WAR_SEC_LOGIN_FAILED
from flask_appbuilder.security.sqla.manager import SecurityManager
from security.security_views import MyAuthRemoteUserView
logger = logging.getLogger(__name__)
# SecurityManager, MySecurityManager
class MySecurityManager(SecurityManager):
logger.info("using customize my security manager")
# auth remote user view
# MyAuthRemoteUserView github
authremoteuserview = MyAuthRemoteUserView
# SecurityManager
# auth_db ,
def auth_user_remote_user(self, username):
"""
this is a overwrite method
REMOTE_USER user Authentication
:type self: User model
"""
user = self.find_user(username=username)
# User does not exist, create one if auto user registration.
if user is None and self.auth_user_registration:
user = self.add_user(
# All we have is REMOTE_USER, so we set
# the other fields to blank.
username=username,
first_name=username.split('@')[0],
last_name='-',
email=username,
role=self.find_role(self.auth_user_registration_role))
# If user does not exist on the DB and not auto user registration,
# or user is inactive, go away.
elif user is None or (not user.is_active()):
logger.info(LOGMSG_WAR_SEC_LOGIN_FAILED.format(username))
return None
self.update_user_auth_stat(user)
return user
以上のコードdemoはgiに提出しました.thubhttps://github.com/yamyamyuo/superset-developmentああ、私が書いたのはみんなに役に立つかどうか分かりませんが、分からないところがあれば、伝言エリアで討論してください.
締めくくり
長い間引きずって、やっとこの文章を整理した.この时间ずっとsupersetのソースコードを见て、感じの进歩は少なくなくて、ソースコードを読むのはやはりコードの能力を高める利器です~
もし本文があなたに役に立つなら
あなたの称賛と関心をけちけちしないでください~
更新をまとめ続けますか?