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あるいは方法は書き換えることができて、それによって自分の望む効果を実現します.
  • 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
    
  • MyAuthRemoteUserView:この実装のロジックも簡単です.メールボックスとパスワードでログインし、formのコミットデータが正確かどうかを確認し、login endpointを書き換えたいです.この過程で使用するLoginFormはとても使いやすくて、もっと言いたいです.これはFlaskが提供するwidgetで、ユーザーが提出したフィールドが正しいかどうか(例えばemailフォーマットが正しいかどうか)、required項目を設定するなどの機能をチェックすることができます.

  • 以上のコードdemoはgiに提出しました.thubhttps://github.com/yamyamyuo/superset-developmentああ、私が書いたのはみんなに役に立つかどうか分かりませんが、分からないところがあれば、伝言エリアで討論してください.

    締めくくり


    長い間引きずって、やっとこの文章を整理した.この时间ずっとsupersetのソースコードを见て、感じの进歩は少なくなくて、ソースコードを読むのはやはりコードの能力を高める利器です~
    もし本文があなたに役に立つなら
    あなたの称賛と関心をけちけちしないでください~
    更新をまとめ続けますか?