Overview of multipage apps

Streamlit 提供了两种内置机制来创建多页面应用。最简单的方法是使用 pages/ 目录。然而,更推荐且更可定制的方法是使用 st.navigation

如果您希望在定义多页面应用程序时获得最大的灵活性,我们建议使用st.Pagest.navigation。通过st.Page,您可以将任何Python文件或Callable声明为应用程序中的页面。此外,您可以在入口点文件(传递给streamlit run的文件)中为页面定义公共元素。通过这些方法,您的入口点文件就像是一个由所有页面共享的画框。

你必须在入口文件中包含st.navigation来配置应用的导航菜单。这也是你的入口文件如何作为页面之间的路由器的方式。

如果你在寻找一个快速且简单的解决方案,只需在你的入口文件旁边放置一个pages/目录。对于pages/目录中的每个Python文件,Streamlit将为你的应用创建一个额外的页面。Streamlit从文件名中确定页面标签和URL,并自动在你的应用侧边栏顶部填充一个导航菜单。

your_working_directory/ ├── pages/ │ ├── a_page.py │ └── another_page.py └── your_homepage.py

Streamlit 根据文件名确定导航中的页面顺序。您可以在文件名中使用数字前缀来调整页面顺序。有关更多信息,请参阅侧边栏中的页面排序方式。如果您想使用此选项自定义导航菜单,可以通过配置 (client.showSidebarNavigation = false) 禁用默认导航。然后,您可以使用st.page_link手动构建自定义导航菜单。使用st.page_link,您可以更改导航菜单中的页面标签和图标,但不能更改页面的URL。

一个页面有四个识别部分如下:

  • 页面源代码: 这是一个包含页面源代码的Python文件或可调用函数。
  • 页面标签: 这是在导航菜单中识别页面的方式。参见 looks_one
  • 页面标题: 这是HTML 元素的内容,以及页面在浏览器标签中的标识方式。参见 looks_two
  • 页面URL路径名: 这是页面相对于应用程序根URL的相对路径。请参见looks_3

此外,一个页面可以有两个图标如下:

  • 页面图标: 这是浏览器标签页中页面标题旁边的图标。参见 looks_4
  • 页面图标: 这是导航菜单中页面标签旁边的图标。参见 looks_5

通常,页面图标和网站图标是相同的,但也可以使它们不同。

1. 页面标签, 2. 页面标题, 3. 页面URL路径名, 4. 页面收藏夹图标, 5. 页面图标

如果您使用st.Page而不声明页面标题或URL路径名,Streamlit会回退到自动确定页面标签、标题和URL路径名,就像您使用带有默认导航菜单的pages/目录时一样。本节描述了这两种多页面应用程序方法之间共享的命名约定。

文件名由以下四个不同部分组成(按顺序):

  1. number: 一个非负整数。
  2. separator: 任何下划线 ("_")、短横线 ("-") 和空格 (" ") 的组合。
  3. identifier: 所有内容直到但不包括 ".py"
  4. ".py"

对于可调用对象,函数名称是identifier,包括任何前导或尾随的下划线。

在导航菜单中,Streamlit 显示页面标签和标题如下:

  1. 如果你的页面有一个identifier,Streamlit 会显示这个identifier。页面identifier中的任何下划线都被视为空格。因此,开头和结尾的下划线不会显示。连续的下划线显示为单个空格。
  2. 否则,如果你的页面有一个number但没有identifier,Streamlit 会显示未修改的number。如果存在前导零,则包括前导零。
  3. 否则,如果你的页面只有一个separator,没有numberidentifier,Streamlit 将不会在侧边栏导航中显示该页面。

以下文件名和可调用对象在侧边栏导航中都将显示为“Awesome page”。

  • "Awesome page.py"
  • "Awesome_page.py"
  • "02Awesome_page.py"
  • "--Awesome_page.py"
  • "1_Awesome_page.py"
  • "33 - 很棒的页面.py"
  • Awesome_page()
  • _Awesome_page()
  • __Awesome_page__()

您的应用程序的主页与应用程序的根URL相关联。对于所有其他页面,它们的identifiernumber将成为它们的URL路径名,如下所示:

  • 如果你的页面有一个来自文件名的identifier,Streamlit 会使用这个identifier并进行一次修改。Streamlit 会将每个连续的空格组(" ")和下划线("_")压缩为单个下划线。
  • 否则,如果您的页面有一个来自可调用对象名称的identifier,Streamlit 将直接使用未修改的identifier
  • 否则,如果您的页面有number但没有identifier,Streamlit 将使用number。如果存在前导零,则包括前导零。

对于上面列表中的每个文件名,URL路径名将是相对于应用程序根URL的“Awesome_page”。例如,如果您的应用程序在localhost端口8501上运行,完整的URL将是localhost:8501/awesome_page。然而,对于最后两个可调用对象,路径名将包括前导和尾随下划线,以完全匹配可调用名称。

用户在不同页面之间导航的主要方式是通过导航小部件。定义多页面应用程序的两种方法都包括一个出现在侧边栏中的默认导航菜单。当用户点击此导航小部件时,应用程序会重新运行并加载选定的页面。您可以选择隐藏默认的导航用户界面,并使用st.page_link构建自己的导航界面。有关更多信息,请参阅使用st.page_link构建自定义导航菜单

如果你需要以编程方式切换页面,请使用 st.switch_page

用户也可以使用上面提到的URL在页面之间导航。当多个文件具有相同的URL路径名时,Streamlit会选择第一个文件(基于导航菜单中的顺序)。用户可以通过访问页面的URL来查看特定页面。

priority_high

重要

通过URL在页面之间导航会创建一个新的浏览器会话。特别是,点击指向其他页面的markdown链接会重置st.session_state。为了保留st.session_state中的值,请通过Streamlit导航命令和小部件处理页面切换,如st.navigationst.switch_pagest.page_link以及内置的导航菜单。

如果用户尝试访问一个不存在的页面URL,他们将看到一个如下所示的模态框,显示“页面未找到”。

Page not found
forum

还有问题吗?

我们的 论坛 充满了有用的信息和Streamlit专家。