如何在Streamlit中实现登录前隐藏所有页面的多页认证
实现Streamlit侧边栏页面的条件渲染(登录权限控制)
完全可以实现你的需求,核心思路是用st.session_state存储登录状态,配合自定义侧边栏导航+页面权限校验,替代Streamlit默认的pages自动渲染逻辑。
实现步骤
1. 管理登录状态
用st.session_state全局存储登录状态,登录成功后标记为True,登出时重置为False。
2. 自定义侧边栏导航
放弃Streamlit默认的pages自动导航,手动构建侧边栏选项:
- 未登录时:仅显示「Sign In」选项
- 登录后:显示Home/others/About,添加「登出」按钮
3. 页面权限拦截
在所有非登录页面的开头添加校验,未登录时强制跳转到登录页。
具体代码实现
主入口脚本(app.py)
作为应用的启动入口,负责控制侧边栏显示和页面跳转:
import streamlit as st # 初始化登录状态 if "logged_in" not in st.session_state: st.session_state["logged_in"] = False def logout(): st.session_state["logged_in"] = False st.rerun() # 未登录状态下的侧边栏与页面跳转 if not st.session_state["logged_in"]: with st.sidebar: st.title("Menu") if st.button("Sign In"): st.switch_page("pages/Login.py") # 默认显示登录页 st.switch_page("pages/Login.py") # 登录状态下的侧边栏与页面跳转 else: with st.sidebar: st.title("Main Menu") selected = st.radio( "", ["Home", "others", "About"] ) if st.button("Logout", on_click=logout): pass # 根据选择跳转对应页面 if selected == "Home": st.switch_page("pages/Home.py") elif selected == "others": st.switch_page("pages/others.py") elif selected == "About": st.switch_page("pages/About.py")
登录页脚本(pages/Login.py)
处理登录逻辑,成功后更新session状态:
import streamlit as st # 初始化状态 if "logged_in" not in st.session_state: st.session_state["logged_in"] = False def validate_login(username, password): # 替换为你的实际登录校验逻辑(比如数据库查询) return username == "test" and password == "123456" st.title("Sign In") username = st.text_input("Username") password = st.text_input("Password", type="password") if st.button("Sign In"): if validate_login(username, password): st.session_state["logged_in"] = True st.success("Login successful!") st.rerun() # 刷新页面切换到登录后的状态 else: st.error("Invalid username or password")
其他页面(如pages/Home.py)
开头添加权限校验,防止直接访问:
import streamlit as st # 未登录则强制跳转登录页 if not st.session_state.get("logged_in", False): st.warning("Please sign in first!") st.switch_page("pages/Login.py") st.stop() # 页面正常内容 st.title("Home Page") st.write("Welcome to the Home page!")
关键说明
- 用
st.rerun()刷新页面状态,确保侧边栏和页面内容实时更新 st.switch_page()需要指定正确的页面路径,注意pages文件夹的层级- 所有非登录页面必须添加权限校验,避免用户通过URL直接访问
内容的提问来源于stack exchange,提问作者Rafikul
相关产品推荐
相关产品推荐

