登录注册多步骤任务和实时展示结果
封装后的 Streamlit 示例代码
访问演示地址
import streamlit as st
import time# In-memory "database" for simplicity
users_db = {'admin': {'password': 'admin123', 'name': 'Admin', 'age': 30, 'favorite_color': 'blue'}
}def register_user(username, password, name, age):"""Register a new user."""if username in users_db:return Falseusers_db[username] = {'password': password, 'name': name, 'age': age}return Truedef login_user(username, password):"""Authenticate a user."""if username in users_db and users_db[username]['password'] == password:st.session_state['logged_in'] = Truest.session_state['user'] = users_db[username]return Truereturn Falsedef logout_user():"""Log out the current user."""st.session_state['logged_in'] = Falsest.session_state.pop('user', None)st.session_state.pop('step1_done', None)st.session_state.pop('step2_done', None)st.experimental_rerun()def show_registration():"""Display the registration form."""st.header("Register")reg_username = st.text_input("Username", key="reg_user")reg_password = st.text_input("Password", type="password", key="reg_pass")reg_name = st.text_input("Name", key="reg_name")reg_age = st.number_input("Age", min_value=0, max_value=120, step=1, key="reg_age")if st.button("Register"):if register_user(reg_username, reg_password, reg_name, reg_age):st.success("Registration successful. Please log in.")else:st.error("Username already exists. Please choose another one.")def show_login():"""Display the login form."""st.header("Login")username = st.text_input("Username", key="login_user")password = st.text_input("Password", type="password", key="login_pass")if st.button("Login"):if login_user(username, password):st.success(f"Welcome back, {st.session_state['user']['name']}!")else:st.error("Invalid username or password.")def show_task():"""Display the multi-step task."""st.title(f"Welcome, {st.session_state['user']['name']}!")# Step 1: Confirm personal detailsst.header("Step 1: Confirm Your Details")name = st.text_input("Name", value=st.session_state['user']['name'])age = st.number_input("Age", value=st.session_state['user']['age'], min_value=0, max_value=120, step=1)if st.button("Submit Step 1"):st.session_state['user']['name'] = namest.session_state['user']['age'] = agest.session_state['step1_done'] = Truest.write(f"Hello, {name}. You are {age} years old.")time.sleep(1) # Simulate a processing delay# Step 2: Update favorite colorif 'step1_done' in st.session_state:st.header("Step 2: Update Your Favorite Color")favorite_color = st.text_input("What's your favorite color?", value=st.session_state['user']['favorite_color'])if st.button("Submit Step 2"):st.session_state['user']['favorite_color'] = favorite_colorst.session_state['step2_done'] = Truest.write(f"Got it! Your favorite color is {favorite_color}.")time.sleep(1) # Simulate a processing delay# Step 3: Final Confirmation and Real-time Processingif 'step2_done' in st.session_state:st.header("Step 3: Final Confirmation")confirm = st.checkbox("Confirm and process the data")if confirm:st.write("Processing data...")progress_bar = st.progress(0)# Simulate a real-time processing taskfor i in range(100):progress_bar.progress(i + 1)time.sleep(0.05) # Simulate real-time data streamingst.success("Task Completed!")st.write(f"Summary: {name}, {age} years old, likes {favorite_color}.")# Option to logoutif st.button("Logout"):logout_user()def main():"""Main function to control the app flow."""st.title("Streamlit Application with Login and Multi-step Task")if 'logged_in' not in st.session_state:st.session_state['logged_in'] = Falseif not st.session_state['logged_in']:show_registration()show_login()else:show_task()if __name__ == "__main__":main()
代码说明
-
封装函数:
register_user
:处理用户注册。login_user
:处理用户登录。logout_user
:处理用户登出。show_registration
:显示注册表单。show_login
:显示登录表单。show_task
:显示多步骤任务界面。
-
main()
函数:- 控制应用程序的主要流程。
- 如果用户未登录,则显示登录和注册表单。
- 如果用户已登录,则显示多步骤任务界面。
-
模块化设计:
- 通过函数封装,代码结构更加清晰,便于维护和扩展。
- 各个功能模块独立,使得添加新功能或修改现有功能变得更加容易。
运行该代码
将这段代码保存为一个 Python 文件(例如 streamlit_app.py
),然后在终端中运行以下命令来启动 Streamlit 应用:
streamlit run streamlit_app.py
启动应用后,你可以注册新用户、登录并体验多步骤任务的功能,所有功能齐全且结构更加简洁。