Streamlit
1 Introduction to Streamlit
1.1 What is Streamlit?
1.2 Why use Streamlit?
1.3 Setting up the environment
1.4 Creating your first Streamlit app
2 Basic Components
2.1 Text elements
2.1 1 Displaying text
2.1 2 Formatting text
2.2 Data display elements
2.2 1 Displaying data frames
2.2 2 Displaying tables
2.3 Input widgets
2.3 1 Text input
2.3 2 Number input
2.3 3 Date input
2.3 4 Dropdown selection
2.3 5 Slider
2.3 6 Checkbox
2.3 7 Radio buttons
2.3 8 Buttons
3 Advanced Components
3.1 Interactive widgets
3.1 1 Multiselect
3.1 2 File uploader
3.1 3 Color picker
3.2 Media elements
3.2 1 Displaying images
3.2 2 Displaying videos
3.2 3 Displaying audio
3.3 Chart elements
3.3 1 Line chart
3.3 2 Bar chart
3.3 3 Area chart
3.3 4 Scatter chart
3.3 5 Map chart
4 Layout and Styling
4.1 Layout components
4.1 1 Columns
4.1 2 Tabs
4.1 3 Expander
4.2 Styling elements
4.2 1 Custom CSS
4.2 2 Theming
4.2 3 Adding custom fonts
5 State Management
5.1 Session state
5.1 1 Managing state across reruns
5.1 2 Persisting state
5.2 Caching
5.2 1 Caching functions
5.2 2 Caching data
6 Deployment
6.1 Deploying to Streamlit Sharing
6.1 1 Setting up Streamlit Sharing
6.1 2 Deploying your app
6.2 Deploying to other platforms
6.2 1 Deploying to Heroku
6.2 2 Deploying to AWS
6.2 3 Deploying to Google Cloud
7 Best Practices
7.1 Writing clean and maintainable code
7.2 Optimizing performance
7.3 Handling errors and exceptions
7.4 Version control with Git
8 Advanced Topics
8.1 Integrating with other libraries
8.1 1 Integrating with Pandas
8.1 2 Integrating with Plotly
8.1 3 Integrating with TensorFlow
8.2 Building complex apps
8.2 1 Creating multi-page apps
8.2 2 Handling authentication
8.2 3 Building interactive dashboards
8.3 Custom components
8.3 1 Creating custom widgets
8.3 2 Extending Streamlit with custom components
9 Case Studies
9.1 Building a data exploration app
9.2 Building a machine learning model deployment app
9.3 Building a real-time data visualization app
5 State Management Explained

State Management Explained

Key Concepts

Session State

Session state in Streamlit refers to data that persists during a user's session. This data is stored in memory and is lost when the session ends. It is useful for storing temporary data that needs to be accessed throughout the session.

import streamlit as st

if 'counter' not in st.session_state:
    st.session_state.counter = 0

st.session_state.counter += 1
st.write(f"Counter: {st.session_state.counter}")
    

Query Parameters

Query parameters are URL parameters that can be used to store state. They are useful for sharing state between different pages or applications. Streamlit allows you to access and modify query parameters using the st.experimental_get_query_params and st.experimental_set_query_params functions.

import streamlit as st

params = st.experimental_get_query_params()
if 'name' in params:
    st.write(f"Hello, {params['name'][0]}!")
else:
    st.write("Hello, World!")
    

Cookies

Cookies are small pieces of data stored on the client-side. They can be used to store state that persists across sessions. Streamlit does not natively support cookies, but you can use external libraries like requests or http.cookies to manage cookies.

import streamlit as st
import http.cookies

cookie = http.cookies.SimpleCookie()
cookie['user'] = 'John Doe'
st.write(f"User: {cookie['user'].value}")
    

Local Storage

Local storage is a client-side storage mechanism that allows you to store data persistently. Unlike cookies, local storage does not have an expiration time and can store larger amounts of data. You can use JavaScript to interact with local storage in Streamlit.

import streamlit as st

st.write("""

""", unsafe_allow_html=True)
    

Global State

Global state refers to shared state across multiple sessions or users. This is useful for applications that need to maintain state across different users or sessions. You can use external databases or services like Redis to manage global state in Streamlit.

import streamlit as st
import redis

r = redis.Redis(host='localhost', port=6379, db=0)
r.set('global_counter', 0)

global_counter = int(r.get('global_counter'))
st.write(f"Global Counter: {global_counter}")
    

Examples

Example 1: Session State

import streamlit as st

if 'counter' not in st.session_state:
    st.session_state.counter = 0

st.session_state.counter += 1
st.write(f"Counter: {st.session_state.counter}")
    

Example 2: Query Parameters

import streamlit as st

params = st.experimental_get_query_params()
if 'name' in params:
    st.write(f"Hello, {params['name'][0]}!")
else:
    st.write("Hello, World!")
    

Example 3: Cookies

import streamlit as st
import http.cookies

cookie = http.cookies.SimpleCookie()
cookie['user'] = 'John Doe'
st.write(f"User: {cookie['user'].value}")
    

Example 4: Local Storage

import streamlit as st

st.write("""

""", unsafe_allow_html=True)
    

Example 5: Global State

import streamlit as st
import redis

r = redis.Redis(host='localhost', port=6379, db=0)
r.set('global_counter', 0)

global_counter = int(r.get('global_counter'))
st.write(f"Global Counter: {global_counter}")
    

Analogies

Think of session state as a notepad that you use during a meeting. It holds temporary notes that are discarded after the meeting. Query parameters are like sticky notes attached to a document, allowing you to pass information between different documents. Cookies are like small reminders you write on your hand, which you can check later. Local storage is like a notebook you keep at home, where you store important information that you can access anytime. Global state is like a shared whiteboard in a conference room, where everyone can see and update the information.

By mastering state management in Streamlit, you can create more dynamic and interactive applications that maintain state across different sessions and users, enhancing the overall user experience.