Effortless permalinks in Streamlit apps
Project description
Effortless permalinks in Streamlit apps
Installation
pip install streamlit-permalink
Basic usage
The streamlit_permalink (shorthand: stp) namespace contains url-aware versions of almost all input widgets from Streamlit. General usage of input widgets is described in Streamlit docs.
stp.checkboxstp.radiostp.selectboxstp.multiselectstp.sliderstp.select_sliderstp.text_inputstp.number_inputstp.text_areastp.date_inputstp.time_inputstp.color_pickerstp.form_submit_buttonstp.pillsstp.segmented_controlstp.togglestp.data_editor
In addition to standard input widgets, it also has an url-aware version of the streamlit-option-menu component: st.option_menu. For this to work, streamlit-option-menu must be installed separately.
Examples
Several example applications demonstrating various use cases are available:
- Browse the examples folder in the repository
- Try the interactive documentation app:
- Locally:
streamlit run examples/docs_app.py - Online: Visit permalink.streamlit.app
Note regarding url_Key
A url_key is required for all widgets. If not specified:
- The widget's
keyvalue will be used asurl_key - If no
keyis present, the widget's label will be used
When url_key is specified, it also sets the widget's key. Therefore, it's recommended to use only url_key:
import streamlit_permalink as stp
# Using key parameter makes the widget URL-aware
text1 = stp.text_input('Type some text', url_key='secret')
# If the user typed 'foobar' into the above text field, the
# URL would end with '?secret=foobar' at this point.
Usage inside forms
To use URL-aware widgets inside Streamlit forms, you need to use st.form and st.form_submit_button, which are the URL-aware counterparts of Streamlit's form functions:
import streamlit_permalink as stp
import streamlit as st
with stp.form('some-form'):
text = stp.text_input('Text field inside form', url_key='secret')
# At this point the URL query string is empty / unchanged, even
# if the user has edited the text field.
if stp.form_submit_button('Submit'):
# URL is updated only when users hit the submit button
st.write(text)
Or with alternative syntax:
import streamlit_permalink as stp
form = stp.form('some-form')
form.text_input('Text field inside form', url_key='secret')
# At this point the URL query string is empty / unchanged, even
# if the user has edited the text field.
if form.form_submit_button('Submit'):
# URL is updated only when users hit the submit button
st.write(text)
Compression
For widgets that may contain large amounts of text (like text_area), you can enable compression to reduce the URL length.
import streamlit_permalink as stp
# Enable compression for text area content
long_text = stp.text_area("Enter long text", url_key="essay", compress=True)
# The text will be compressed before being added to the URL
By default, compression uses a built-in text compression algorithm. You can also provide custom compression and decompression functions:
import streamlit_permalink as stp
import gzip
import base64
def custom_compress(value: str) -> str:
# Compress the string and encode the binary result as base64
compressed = gzip.compress(value.encode('utf-8'))
return base64.b64encode(compressed).decode('utf-8')
def custom_decompress(value: str) -> str:
# Decode the base64 string back to binary and then decompress
binary_data = base64.b64decode(value.encode('utf-8'))
return gzip.decompress(binary_data).decode('utf-8')
# Use custom compression for a text area
long_text = stp.text_area(
"Enter long text",
url_key="essay",
compress=True,
compressor=custom_compress,
decompressor=custom_decompress
)
Compression also works with lists, such as in multiselect widgets, where each item in the list will be compressed individually.
Disabling URL-aware Statefulness
In some cases, you might want to use a widget without URL-aware functionality. You can disable this by setting stateful=False:
import streamlit_permalink as stp
# This widget will behave like a regular Streamlit widget
# and won't update the URL or be controlled by URL parameters
text = stp.text_input("Enter text", url_key="non_url_text", stateful=False)
This is useful when you have widgets that should not affect the shareable state of your application.
Note about Data Editor
Date, Datetime, and Time columns must be declared using the column configs or the values will be converted to the number of ms since epoch.
Development and Testing
To set up the development environment and run tests:
- Clone the repository and install in editable mode with test dependencies:
git clone https://github.com/franekp/streamlit-permalink.git
cd streamlit-permalink
pip install -e ".[test]"
- Run the tests:
# Run all tests
pytest
# Run a specific test file
pytest tests/test_checkbox.py
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file streamlit_permalink_pg-1.3.0.tar.gz.
File metadata
- Download URL: streamlit_permalink_pg-1.3.0.tar.gz
- Upload date:
- Size: 41.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.22
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c501f20f73db4613aeae5ca4a33504bb6c36881b4cc5fcd8bab3d4ef861ab26c
|
|
| MD5 |
fef6bdd1e82dbf626c81a0e5108aebcf
|
|
| BLAKE2b-256 |
f98d8ee713e66238d9a33024db90b5e5cb0ec043e7d846201477a294f8f0c25f
|
File details
Details for the file streamlit_permalink_pg-1.3.0-py3-none-any.whl.
File metadata
- Download URL: streamlit_permalink_pg-1.3.0-py3-none-any.whl
- Upload date:
- Size: 62.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.22
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6888af14868d068b986dbb7fb5dd3a75b45861efb40694dd2a0b975c4ca28a16
|
|
| MD5 |
99408ab3453cfab317eabc23a561ed0d
|
|
| BLAKE2b-256 |
9907863eb270436ba16706611722734ead2997a68ce9c76bfaf8616fb628d1ac
|