質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

5022閲覧

Streamlitで作成したWebアプリで、CSVダウンロードや検索機能を実現させたい

ggg3

総合スコア17

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/06/27 09:01

前提・実現したいこと

以下のコードはcsvからデータを読み取り、DataFrameに変換し、最終的にStreamlitによってWeb上(HTML)に可視化するコードです。
更に次の2点の機能として追加しています。

  • 検索機能を追加し、検索ボックスにキーワードを入れて検索ボタンを押すとDataFrameの該当箇所のみを取得・表示する
  • CSVボタンを押すとDataFrameをCSVダウンロードできるようにする
from ipython_genutils.py3compat import encode import pandas as pd import numpy as np import streamlit as st import base64 def main(): @st.cache def get_df(path): df = pd.read_csv(path ,encoding='shift jis') return df # CSVダウンロード def download_link(object_to_download, download_filename, download_link_text): if isinstance(object_to_download,pd.DataFrame): object_to_download = object_to_download.to_csv(index=False, encoding='shift-jis') b64 = base64.b64encode(object_to_download.encode()).decode() return f'<a href="data:file/txt;base64,{b64}" download="{download_filename}">{download_link_text}</a>' df = get_df('sample01.csv') st.write(df) if st.button('csv', key='01'): tmp_download_link = download_link(df, 'sample.csv', 'Click here') st.markdown(tmp_download_link, unsafe_allow_html=True) keyword = st.text_input("nameから検索", value="",) if st.button('検索'): ret = df[df['name'].str.contains(str(keyword))] st.write(ret) if __name__ == '__main__': st.title('sample system') main() # username = st.sidebar.text_input("UserName:", value="",) # password = st.sidebar.text_input("Password:", value="", type="password") # if st.sidebar.button('Login'): # if username == 'admin' and password == 'password': # st.sidebar.success("Logged In as {}".format(username)) # main() # else: # st.error("password error")

上記は実現できました。
最後にログイン機能を追加しようと考え、上記コードのコメント部分を作成しました。
(動作させる際はmain()をコメントアウトし、既にコメントアウトされている部分を有効にして下さい)

発生している問題・エラーメッセージ

ログイン機能を追加し、ユーザ名admin,パスワードpasswordでログインした後に、上記のCSVダウンロード機能や検索機能を実行すると、画面全体が白くなり何も表示されなくなります。
原因がわからず困っています。どなたか教えて下さい。よろしくお願いいたします。

コード中に記載のsample01.csvの内容は以下です。

nonametype
1name_01A
2name_02B
3name_03C
4name_04D
5name_05E
6name_06F
7name_07A
8name_08A
9name_09A
10name_10A

補足情報(FW/ツールのバージョンなど)

・Windows 10 pro 64bit
・Python 3.9.4
・streamlit 0.83.0
・numpy 1.20.2
・pandas 1.2.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

詳しくはないのですが、ほかに回答がつかないようなので。

streamlitの動作は、操作毎にスクリプトを最初から実行しなおしているというイメージになります。

変更後のプログラムでは、Loginボタンを押したとき(かつ、ユーザ名とパスワードがあっているとき)に、main()が実行される形になっているので、それ以外の操作ではmain()は実行されません。
csvや検索のボタンを押したときは、main()が実行されないので、空白表示になります。

対応案

  1. Loginボタンの代わりに、Loginチェックボックスにする。

チェックボックスだと一度ONにすると毎回main()が動くようにできます。

  1. セッション情報を保存するようにする。

Streamlitでセッション情報を保存する方法は、検索するとSessionState.pyとかが出てきます。
こんな感じになるんだと思います。(他にもっといいやり方があるかもしれません)

python

1if __name__ == '__main__': 2 st.title('sample system') 3 4 session = SessionState.get(login=False) 5 6 username = st.sidebar.text_input("UserName:", value="",) 7 password = st.sidebar.text_input("Password:", value="", type="password") 8 if st.sidebar.button('Login'): 9 if username == 'admin' and password == 'password': 10 session.login = True 11 st.sidebar.success("Logged In as {}".format(username)) 12 else: 13 session.login = False 14 st.error("password error") 15 16 if session.login: 17 main()

投稿2021/06/30 03:14

bsdfan

総合スコア4794

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ggg3

2021/06/30 14:19

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問