「dash」というライブラリを使ってみた。

Python向けのwebアプリ開発用ライブラリ「dash」を使ってみました。

Qiitaの記事を見て興味を持ったので触ってみました。
公式サイトはこちら
Plotly.jsというjavascript向けのグラフ描画ライブラリを作っている会社が、Plotly.jsを使ってPythonでも簡単にデータビジュアライズ用のアプリを開発できるライブラリを作った、ということらしい。

実際に使ってみる。
まずはpipで必要なものをインストールする。
これは2系も3系も共通とのこと。

pip install dash==0.19.0  # The core dash backend
pip install dash-renderer==0.11.1  # The dash front-end
pip install dash-html-components==0.8.0  # HTML components
pip install dash-core-components==0.14.0  # Supercharged components
pip install plotly --upgrade  # Plotly graphing library used in examples

試しに、テキスト入力を受け付けてそれをテーブルとして表示するアプリを書いてみた。

#! /usr/bin/env python3
# coding: utf-8

import dash
from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html


app = dash.Dash()

texts = []


def make_board(sentences):
    if not sentences:
        return html.H4('No sentences')
    return html.Table(
        [html.Tr([html.Th('Sentence')])] +
        [html.Tr([html.Td(sentence)]) for sentence in sentences]
    )


app.layout = html.Div([
    dcc.Input(id='text', type='text'),
    html.Div(id='texts')
])


@app.callback(
    Output(component_id='texts', component_property='children'),
    [Input(component_id='text', component_property='value')]
)
def update_table(input_value):
    texts.append(input_value)
    return make_board(texts)


if __name__ == '__main__':
    app.run_server()

Webアプリ部分はFlaskを継承しているとのことなので、実装もFlaskっぽくなっている。
dash_core_componentsには入力を受け付ける要素(inputやradio buttonなど)があり、dash_html_componentsにはhtmlタグに当たる要素(divやh1など)が入っている。
これらを使うことで、簡単にwebページのレイアウトを作ることができる。

また、関数に対して@app.callbackをつけてOutputとInputを設定すると、「特定の入力要素の値が変更されると、逐次的にメソッドを呼び出して結果をOutputに送る」ということをやってくれる。
なので、画面内の動作なんかも簡単に制御することが可能。

また、このライブラリには先程のPlotly.jsを使う仕組みも組み込まれているので、簡単にグラフをページに貼り付けることもできる。
チュートリアルにもあるが、Pythonの別のライブラリとも連携することが可能なので、「Pandasでweb上のデータを取得して、その結果をグラフ描画する」なんて言うときにも使えるし、「データ内の特定の範囲の絞込をしたい」というときもInput・Outputと組み合わせて実装することで実現できる。

ただ、たしかにグラフを描画したり入出力を実装するのは簡単だが、デザインやレイアウトをどこまで思った通りにできるかは未知数。
CSSも設定できるとのことなので、できなくはないと思うが、やってみないとわからない。

チュートリアルには、もっとグラフ描画やインタラクションの実装方法についてたくさん例がのっているので、興味があれば見てみると良いかも。