Multi-page Streamlit apps

This topic provides an example of a multi-page Streamlit app. The following examples show a multi-page Streamlit app that contains the following files:

  • The main Streamlit app (streamlit_main.py): This is the Streamlit app that you provide as the value to the MAIN_FILE property of the CREATE STREAMLIT command. This file is also displayed by default when you view the Streamlit app in Snowsight.

  • data_frame_demo.py: Displays a data frame for the application.

  • plot_demo.py: Displays a plot of the data for the application.

For information about working with multiple files in Streamlit in Snowflake, see Create and deploy Streamlit apps using Snowsight.

Note

When you host multipage apps in Streamlit in Snowflake, URL pathnames are prefixed with /!. For example, if the relative path to a page is /page2 in a multipage app, its relative path in Streamlit in Snowflake becomes /!/page2 as shown in the following URL: https://app.snowflake.com/org/account_name/#/streamlit-apps/DB.SCHEMA.APP_NAME/!/page_2

streamlit_main.py

import streamlit as st

st.title('Multi-page app demo')
st.write('This is the landing page for the app. Click in the left sidebar to open other pages in the app')
Copy

data_frame_demo.py

import streamlit as st

# Write directly to the app
st.title("Dataframe Demo App :balloon:")

# Get the current credentials
session = st.connection('snowflake').session()

# Use an interactive slider to get user input
hifives_val = st.slider(
    "Number of high-fives in Q3",
    min_value=0,
    max_value=90,
    value=60,
    help="Use this to enter the number of high-fives you gave in Q3",
)

#  Create an example dataframe
#  Note: this is just some dummy data, but you can easily connect to your Snowflake data
#  It is also possible to query data using raw SQL using session.sql() e.g. session.sql("select * from table")
created_dataframe = session.create_dataframe(
    [[50, 25, "Q1"], [20, 35, "Q2"], [hifives_val, 30, "Q3"]],
    schema=["HIGH_FIVES", "FIST_BUMPS", "QUARTER"],
)

# Execute the query and convert it into a Pandas dataframe
queried_data = created_dataframe.to_pandas()

# Create a simple bar chart
# See docs.streamlit.io for more types of charts
st.subheader("Number of high-fives")
st.bar_chart(data=queried_data, x="QUARTER", y="HIGH_FIVES")

st.subheader("Underlying data")
st.dataframe(queried_data, use_container_width=True)
Copy

plot_demo.py

import time

import numpy as np

import streamlit as st
from streamlit.hello.utils import show_code


def plotting_demo():
    progress_bar = st.sidebar.progress(0)
    status_text = st.sidebar.empty()
    last_rows = np.random.randn(1, 1)
    chart = st.line_chart(last_rows)

    for i in range(1, 101):
        new_rows = last_rows[-1, :] + np.random.randn(5, 1).cumsum(axis=0)
        status_text.text("%i%% Complete" % i)
        chart.add_rows(new_rows)
        progress_bar.progress(i)
        last_rows = new_rows
        time.sleep(0.05)

    progress_bar.empty()

    # Streamlit widgets automatically run the script from top to bottom. Because
    # this button is not connected to any other logic, it just causes a plain
    # rerun.
    st.button("Re-run")


st.set_page_config(page_title="Plotting Demo", page_icon="📈")
st.markdown("# Plotting Demo")
st.sidebar.header("Plotting Demo")
st.write(
    """This demo illustrates a combination of plotting and animation with
    Streamlit. We're generating a bunch of random numbers in a loop for around
    5 seconds. Enjoy!"""
)

plotting_demo()

show_code(plotting_demo)
Copy