Python

【Python】Streamlitでログイン認証を実装する

この記事は約8分で読めます。

 

今回はStreamlitでログイン認証を実装する方法について紹介したいと思います

 

環境・バージョン

 

・streamlit==1.13.0

 

$ pip install streamlit==1.13.0

 

残りのライブラリはインストールされていない場合はそのまま「pip  install ○○」でインストールしてください。streamlitのバージョンを1.13.0で固定している理由は他のバージョンだとライブラリの読み込みの際に以下のようなエラーが発生したためです。streamlitは目下開発中のライブラリなので今後もバージョンアップでメソッドの配置が変わる可能性が高いのでライブラリのバージョンには注意してください。

 

Traceback (most recent call last):
  File "/usr/local/bin/streamlit", line 5, in <module>
    from streamlit.web.cli import main
  File "/usr/local/lib/python3.7/dist-packages/streamlit/__init__.py", line 55, in <module>
    from streamlit.delta_generator import DeltaGenerator as _DeltaGenerator
  File "/usr/local/lib/python3.7/dist-packages/streamlit/delta_generator.py", line 45, in <module>
    from streamlit.elements.arrow_altair import ArrowAltairMixin
  File "/usr/local/lib/python3.7/dist-packages/streamlit/elements/arrow_altair.py", line 42, in <module>
    from streamlit.elements.utils import last_index_for_melted_dataframes
  File "/usr/local/lib/python3.7/dist-packages/streamlit/elements/utils.py", line 82, in <module>
    ) -> LabelVisibilityMessage.LabelVisibilityOptions.ValueType:
  File "/usr/local/lib/python3.7/dist-packages/google/protobuf/internal/enum_type_wrapper.py", line 115, in __getattr__
    self._enum_type.name, name))
AttributeError: Enum LabelVisibilityOptions has no value defined for name 'ValueType'
npx: installed 22 in 4.266s
your url is: https://eight-ties-drop-34-80-129-36.loca.lt

 

コード

 

<app.py>

import streamlit as st
import pandas as pd
import numpy as np
import sqlite3 
import hashlib


conn = sqlite3.connect('database.db')
c = conn.cursor()


import hashlib
def make_hashes(password):
    return hashlib.sha256(str.encode(password)).hexdigest()

def check_hashes(password,hashed_text):
    if make_hashes(password) == hashed_text:
        return hashed_text
    return False
def create_user():
    c.execute('CREATE TABLE IF NOT EXISTS userstable(username TEXT,password TEXT)')

def add_user(username,password):
    c.execute('INSERT INTO userstable(username,password) VALUES (?,?,?)',(username,password))
    conn.commit()

def login_user(username,password):
    c.execute('SELECT * FROM userstable WHERE username =? AND password = ?',(username,password))
    data = c.fetchall()
    return data

def main():
    st.title("ログイン機能テスト")
    menu = ["ホーム","ログイン","サインアップ"]
    choice = st.sidebar.selectbox("メニュー",menu)
    if choice == "ホーム":
        st.subheader("ホーム画面です")
    elif choice == "ログイン":
        st.subheader("ログイン画面です")
        username = st.sidebar.text_input("ユーザー名を入力してください")
        password = st.sidebar.text_input("パスワードを入力してください",type='password')
        if st.sidebar.checkbox("ログイン"):
            create_user()
            hashed_pswd = make_hashes(password)
            result = login_user(username,check_hashes(password,hashed_pswd))
            print('result',result)
            if result:
                st.success("{}さんでログインしました".format(username))      
            else:
                st.warning("ユーザー名かパスワードが間違っています")
            if result[0][2]:
                st.write(f'あなたの権限は{result[0][2]}です')
                st.subheader('折れ線グラフ')
                chart_data = pd.DataFrame(
                np.random.randn(7, 3),
                columns=['a', 'b', 'c'])
                st.line_chart(chart_data)
                st.dataframe(chart_data)
    elif choice == "サインアップ":
        st.subheader("新しいアカウントを作成します")
        new_user = st.text_input("ユーザー名を入力してください")
        new_password = st.text_input("パスワードを入力してください",type='password')
        if st.button("サインアップ"):
            create_user()
            add_user(new_user,make_hashes(new_password)
            st.success("アカウントの作成に成功しました")
            st.info("ログイン画面からログインしてください")
if __name__ == '__main__':
    main()

 

上記をapp.pyとして保存したらそれを以下のコマンドで実行してください

 

# アプリ起動
$ streamlit run app.py

 

実行すると以下のようにローカルホストのアドレスが表示されるのでそれをコピペしてブラウザに張り付けてアクセスしてください

 

 

すると以下のような画面が表示されます

 

 

サインアップからユーザー名とパスワードを登録して、それをログイン時に入力すればログインできるようになっています

 

<メモ>

このアプリをローカルホストからインターネット上にデプロイする方法については以下が参考になりました

[簡単爆速]Pythonだけでデプロイ。Streamlit1.0の使い方を紹介 - Qiita
はじめに データ分析の結果や研究成果を公開するとき、多くの方に使ってもらえるように、何かしらツール化したほうがいい場面があります。 Pythonですと、DjangoやFlaskなどを活用することが多いとは思いますが、Stream...

 

コメント

タイトルとURLをコピーしました