You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:30:44