streamlitとは? (個人見解)
Web開発の経験がなくても、Pythonを知っていれば、Webサイトが作れるツール。
(コレ ↑ が、大きなメリットと思います。フロント技術は標準で充実しています)
では、デメリットを考えると…
・多要素認証のような複雑な仕組みを作るのには不向きな感じ。
・JavaScriptやCSSが使えない事による弊害 = 凝った画面は作れない等
・あらゆる処理がサーバサイドに寄る = 1つ1つの画面操作の動作が重い感じ
以上から、同時アクセスが集中しない簡易使い方であれば、アリな気がします。
(特にプロトタイプや営業活動等の見せる部分では、有効な手法と感じました)
※実際に実装してみましょう・・・
フォルダやファイルの構成
拡張性を意識して、少しプログラムを分割したサンプルを用意しています。
└── test
├── venv (仮想用フォルダ)
├── main.py (Streamlitを起動するファイル)
├── sidebar.py (画面横のメニュー欄)
├── graph1.py (折れ線グラフ)
└── graph2.py (散布図)
準備作業
sudo mkdir /test (作業フォルダ作成)
cd /test (カレント移動)
sudo python3 -m venv venv (仮想環境の構築)
sudo chmod 777 -R /test (権限をゆるく設定)
source /test/venv/bin/activate (仮想環境の立ち上げ)
pip3 install streamlit
import streamlit as st
from sidebar import sidebar_process
from graph1 import show_graph as gra1
from graph2 import show_graph as gra2
if __name__ == "__main__":
gra, val = sidebar_process()
if gra == "折れ線":
gra1(val)
else:
gra2(val)
import streamlit as st
def sidebar_process():
opt1 = ["折れ線", "散布図"]
graf = st.sidebar.selectbox("グラフ選択", opt1)
opt2 = ["いろは", "かき"]
valu = st.sidebar.selectbox("値選択", opt2)
return graf, valu
import streamlit as st
import pandas as pd
import numpy as np
def show_graph(val):
if val == "いろは":
chart_data = pd.DataFrame(np.random.randn(50, 3), columns=["い", "ろ", "は"])
else:
chart_data = pd.DataFrame(np.random.randn(50, 2), columns=["か", "き"])
st.line_chart(chart_data)
import streamlit as st
import pandas as pd
import numpy as np
def show_graph(val):
data = pd.DataFrame({
'weight': np.random.normal(50, 20, 30),
'height': np.random.normal(50, 20, 30)
})
if val == "いろは":
data['class'] = np.random.choice(['い','ろ','は'], 30)
else:
data['class'] = np.random.choice(['か','き'], 30)
st.scatter_chart(data, x='weight', y='height', color='class')
テストしてみる
(仮想環境のまま)streamlit run main.py (streamlitが実行されます)
その後、パソコンより「http://(RaspberryのIPアドレス):8501」へアクセスします。
streamlitらしい画面が表示されますよね?
Ctrl+C キーで、streamlitを停止します。
deactivate (仮想を終了します)
streamlitをサービス起動する方法
Apacheを使うと、そのままサービス起動するようになるのですが、streamlitの場合、systemdにてサービス登録する事で、電源を入れた時に自動起動させる事が可能です。
sudo vi /etc/systemd/system/streamlit_service.service
[Unit]
Description=Streamlit Service
After=network.target
[Service]
WorkingDirectory=/test
Environment=PATH=/test/venv/bin:$PATH
ExecStart=/test/venv/bin/streamlit run /test/main.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start streamlit_service
この後、パソコンより「http://(RaspberryのIPアドレス):8501」へアクセスします。
streamlitの画面が表示されますよね?
sudo systemctl enable streamlit_service (サービス起動として登録)
sudo reboot (raspberryを再起動)
この後、パソコンより「http://(RaspberryのIPアドレス):8501」へアクセスします。
streamlitの画面が表示されますよね?
これでサービス登録も終了です。 お疲れさまでした~