在Streamlit中登录小部件的问题

我正在尝试为Streamlit应用创建一个登录系统,但我在逻辑上遇到了一些问题。我有一个Python文件用于登录逻辑,另一个文件用于系统逻辑。更具体地说,我想在点击“登录”时从登录屏幕跳转到仪表板,而在点击“注销”时从仪表板返回到登录界面。

我尝试将authenticator.logout()从第一个Python文件的login()函数中分离出来,并在第二个文件的st.session_state[‘page’] = ‘dashboard’块中调用它。我还尝试了一些其他方法,比如在st.session_state[‘page’] = ‘dashboard’块中调用run_app(),但我无法实现这个功能。我想要的是当我点击“注销”时,能够跳出st.session_state[‘page’] = ‘dashboard’块并重定向到st.session_state[‘page’] = ‘login’块。

第一个Python文件包含登录逻辑:

import streamlit as st
import mysql.connector
from mysql.connector import Error
import streamlit_authenticator as stauth
from Streamlit_app import run_app
### def create_connetion() and def fetch_credentials() first ###
def login():
    conn = create_connection()
    credentials = format_credentials(fetch_credentials(conn))
    if credentials:
        authenticator = stauth.Authenticate(
            credentials=credentials,
            cookie_name="auth",
            cookie_key="my_key",
            cookie_expiry_days=3,
        )
        name, auth_status, username = authenticator.login()
        if auth_status is None:
            st.warning("Please enter your credentials")
            return auth_status
        if auth_status is False:
            st.error("Username or Password is incorrect")
            return auth_status
        if auth_status:
            user_info = credentials['usernames'][username]
            first_name = user_info["name"]
            last_name = user_info["last_name"]
            date_of_birth = user_info["date_of_birth"]
            st.sidebar.subheader(f'Welcome {first_name} {last_name}!')
            chat_dir = "your_chat_dir"
            run_app(chat_dir)
            authenticator.logout('Log Out', 'sidebar')
            return auth_status
    else:
        st.error("No users found in the database")
    conn.close()
#st.title('Login System')
#login()

第二个Python文件包含页面逻辑:

import streamlit as st
from Streamlit_signup import sign_up
from Streamlit_login import login
if 'page' not in st.session_state:
    st.session_state['page'] = 'login'
if 'auth_status' not in st.session_state:
    st.session_state['auth_status'] = None
if st.session_state['page'] == 'login':
    st.title('AI Chatbot')
    col_1, col_2 = st.columns([14, 2])
    with col_2:
        if st.button(":green[Sign up]"):
            st.session_state['page'] = 'sign_up'
            st.rerun()
    auth_status = login()
    st.write("auth status: " + str(auth_status))
    if auth_status:
        st.write("auth status in dashboard: " + str(auth_status))
        st.session_state['page'] = 'dashboard'
        st.session_state['auth_status'] = auth_status
        st.rerun()
elif st.session_state['page'] == 'sign_up':
    st.title("Sign Up Form")
    sign_up()
    if st.button("Back to Login"):
        st.session_state['page'] = 'login'
        st.session_state['auth_status'] = False
        st.rerun()
elif st.session_state['page'] == 'dashboard':
    st.title("Dashboard")
    st.write(st.session_state['auth_status'])
    login()
    st.session_state['page'] = 'login'

一些图片帮助说明:

  1. 登录页面

  2. 仪表板

  3. 注销后仍停留在仪表板


回答:

我认为这是一个更好的做法,并且它能正常工作。

import streamlit as st
import mysql.connector
from mysql.connector import Error
import streamlit_authenticator as stauth
from Streamlit_app import run_app
from Streamlit_signup import sign_up
def login():
    conn = create_connection()
    credentials = format_credentials(fetch_credentials(conn))
    if credentials:
        authenticator = stauth.Authenticate(
            credentials=credentials,
            cookie_name="auth",
            cookie_key="my_key",
            cookie_expiry_days=3,
        )
        name, auth_status, username = authenticator.login()
        if auth_status is None:
            st.warning("Please enter your credentials")
            return auth_status, authenticator
        if auth_status is False:
            st.error("Username or Password is incorrect")
            return auth_status, authenticator
        if auth_status:
            user_info = credentials['usernames'][username]
            first_name = user_info["name"]
            last_name = user_info["last_name"]
            date_of_birth = user_info["date_of_birth"]
            st.sidebar.subheader(f'Welcome {first_name} {last_name}!')
            chat_dir = "YOUT_CHAT_DIR"
            run_app(chat_dir)
            return auth_status, authenticator
    else:
        st.error("No users found in the database")
    conn.close()
def logout(authenticator):
    authenticator.logout('Log Out', 'sidebar')
    st.session_state['auth_status'] = None
if 'page' not in st.session_state:
    st.session_state['page'] = 'login'
if 'auth_status' not in st.session_state:
    st.session_state['auth_status'] = None
if st.session_state['page'] == 'login':
    auth_status, authenticator = login()
    if auth_status:
        st.session_state['auth_status'] = auth_status
        logout(authenticator)
    else:
        if st.sidebar.button("Sign up"):
            st.session_state['page'] = 'sign_up'
            st.rerun()
elif st.session_state['page'] == 'sign_up':
    sign_up()
    if st.button("Back to Login"):
        st.session_state['page'] = 'login'
        st.rerun()

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注