在Streamlit多页面应用的开发过程中,我们经常会遇到部分页面不需要在侧边栏导航中展示的情况,比如仅用于权限验证的登录页、数据中转的跳转页,或者仅内部逻辑调用的功能页。默认的Streamlit多页面规则会自动扫描pages目录下的所有Python文件并添加到侧边栏,直接移除文件会导致功能缺失,因此需要专门的隐藏方案。

方法一:通过配置文件排除指定页面
Streamlit支持通过.streamlit/config.toml配置文件自定义侧边栏的页面展示规则,我们可以通过配置忽略指定路径的页面文件。首先在项目的根目录创建.streamlit文件夹,再在其中创建config.toml文件,添加如下配置:
[server] # 排除pages目录下以_开头的文件,这些文件不会出现在侧边栏 page_dir_ignore = ["pages/_*.py"]
之后我们只需要把需要隐藏的页面文件命名为_login.py、_redirect.py这类以下划线开头的名称,放在pages目录下,这些文件就不会被自动添加到侧边栏,同时仍然可以通过路径访问,比如访问http://localhost:8501/pages/_login即可打开对应的隐藏页面。
方法二:自定义侧边栏导航替代默认导航
如果不想修改文件命名规则,也可以完全自定义侧边栏的导航内容,跳过默认的自动生成逻辑。核心思路是先获取所有页面文件,筛选出需要展示的页面,再通过streamlit_option_menu或者原生的st.sidebar.selectbox生成自定义导航。
首先安装自定义菜单依赖:
pip install streamlit_option_menu
主应用文件app.py的代码如下:
import streamlit as st
from streamlit_option_menu import option_menu
import os
# 获取pages目录下所有页面文件,排除需要隐藏的文件
page_dir = "pages"
all_pages = [f for f in os.listdir(page_dir) if f.endswith(".py")]
# 定义需要隐藏的页面文件名列表
hide_pages = ["_login.py", "hidden_page.py"]
show_pages = [f for f in all_pages if f not in hide_pages]
# 自定义侧边栏导航
with st.sidebar:
selected_page = option_menu(
menu_title="页面导航",
options=[os.path.splitext(f)[0] for f in show_pages],
icons=["house", "bar-chart", "table"] # 对应每个页面的图标
)
# 根据选择的页面加载对应内容
page_path = os.path.join(page_dir, f"{selected_page}.py")
with open(page_path, "r", encoding="utf-8") as f:
exec(f.read())
这种方式的灵活性更高,可以完全控制侧边栏展示的页面名称、图标、排序,甚至可以根据用户的权限动态显示不同的页面。
方法三:通过会话状态控制侧边栏显示
如果隐藏页面的逻辑和用户状态相关,比如未登录时隐藏所有功能页,只展示登录页,那么可以通过st.session_state控制侧边栏的渲染逻辑。示例代码如下:
import streamlit as st
# 初始化登录状态
if "is_login" not in st.session_state:
st.session_state.is_login = False
# 未登录时只展示登录页,不渲染侧边栏导航
if not st.session_state.is_login:
st.title("登录页")
username = st.text_input("用户名")
password = st.text_input("密码", type="password")
if st.button("登录"):
if username == "admin" and password == "123456":
st.session_state.is_login = True
st.rerun()
else:
st.error("用户名或密码错误")
else:
# 登录后渲染侧边栏导航
with st.sidebar:
page = st.selectbox("选择页面", ["首页", "数据页", "设置页"])
if page == "首页":
st.title("首页内容")
elif page == "数据页":
st.title("数据页内容")
elif page == "设置页":
st.title("设置页内容")
这种方案适合和权限系统结合,根据用户的登录状态、角色动态调整侧边栏的展示内容,实现更细粒度的页面访问控制。
不同方案的选择建议
我们可以根据实际的业务场景选择合适的方案:
- 如果只是需要固定隐藏几个页面,不需要动态变化,优先选择配置文件方案,实现最简单,不需要修改太多业务代码。
- 如果需要自定义侧边栏的样式、图标、排序,或者需要动态控制展示的页面列表,选择自定义导航方案。
- 如果隐藏逻辑和用户状态、权限相关,选择会话状态控制方案,可以和权限系统无缝结合。
以上三种方案都可以实现Streamlit多页面应用中隐藏侧边栏页面的需求,开发者可以根据项目的实际情况灵活选择或者组合使用。