HTML builder with server routing for Python
Project description
Sistine
React-like UI framework for Python, powered by Streamlit. Build incredibly flexible, custom-designed UIs with HTML/Tailwind, while leveraging Streamlit's native widgets and data caching.
Why Sistine?
Streamlit is fantastic for data apps, but often developers complain:
- Hard to customize CSS/Layouts or use Tailwind.
- Complex nested UIs are difficult to build.
- UI elements lack flexibility.
Sistine fixes this! You can write full custom HTML, inject Tailwind CSS, and separate your concerns using a React-like component approach, all while letting Streamlit handle the backend server, caching, and state management.
Installation
pip install sistine
Features
- React-like Syntax (Chaining): Write clean components
el.div(cls="...")(children). - Tailwind CSS Built-in: One command
app.use_tailwind()to enable utility classes. - Native Streamlit Interoperability: Mix
st.write()or Streamlit buttons alongside Sistine components! - Auto-caching: Use
@queryto fetch API/Database, and it automatically hooks intost.cache_data. - MVC Modularity: Fully supports splitting code into Models, Views, and Controllers.
Quick Start
from sistine import streamlit as st, Sistine, el
app = Sistine(title="My App")
app.use_tailwind()
# 1. Modular React-like Component using Chaining Syntax
def Card(title: str, description: str):
return el.div(cls="bg-white p-6 rounded-xl shadow-md")(
el.h2(cls="text-2xl font-bold text-gray-800")(title),
el.p(cls="text-gray-600 mt-2")(description)
)
# 2. Define Routes Easily
@app.sistine("/")
def home():
# You can still use Streamlit native features!
st.toast("Welcome to Sistine!")
return str(
el.div(cls="min-h-screen bg-gray-50 p-10 flex flex-col items-center justify-center")(
el.h1(cls="text-4xl font-extrabold text-blue-600 mb-8")("Hello Sistine!"),
Card("Awesome Framework", "Return HTML/Tailwind seamlessly inside Streamlit.")
)
)
if __name__ == "__main__":
app.run(port=8080)
Run your app normally:
python app.py
The Power of @query
Say goodbye to slow apps! Use @query for any API calls or expensive database queries. Sistine automatically caches it using st.cache_data in the background.
from sistine import query
import requests
@query
def fetch_users():
# Only hits the network once, subsequent calls are instantly cached!
res = requests.get("https://jsonplaceholder.typicode.com/users")
return res.json()
Streamlit State & Widgets
Sistine runs inside Streamlit. You can use st.session_state to make your Sistine UI reactive!
from sistine import streamlit as st, Sistine, el
app = Sistine()
if "count" not in st.session_state:
st.session_state.count = 0
@app.sistine("/")
def counter():
# Native Streamlit Widget
if st.button("Add +1"):
st.session_state.count += 1
# Sistine UI that reacts to Streamlit state!
return str(
el.h1(cls="text-3xl")(f"Count is: {st.session_state.count}")
)
Examples
Check out the examples/ directory for complete applications:
tailwind_app.py- Basic Tailwind setup.routing_app.py- Multi-page routing with URL parameters (/user/{id}).dashboard_app.py- Complex UI layout (sidebar, grid cards).pokeapi_app.py- Working API integration showcasing@query.state_app.py- Interactivity using Streamlit'ssession_state.mvc_app/- Example of organizing a massive Sistine app using MVC pattern.
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 sistine-0.3.0.tar.gz.
File metadata
- Download URL: sistine-0.3.0.tar.gz
- Upload date:
- Size: 17.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e71b0a40e481efb88252a219760edd9c9009a7c2e0652bf2e96d4263c7d7f9a8
|
|
| MD5 |
966af760a3e807078e4fc5733625a1e2
|
|
| BLAKE2b-256 |
0808045a5ce546febc5a6b428c10082b668f8348228031ad747050e284f040ab
|
File details
Details for the file sistine-0.3.0-py3-none-any.whl.
File metadata
- Download URL: sistine-0.3.0-py3-none-any.whl
- Upload date:
- Size: 17.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f91cb15e0261397bd40c639289cb70151a9e9743e7e50a93d6305c2127c4e79
|
|
| MD5 |
8cdc4500e9db0ef47914c22769613f9b
|
|
| BLAKE2b-256 |
da34d97711cc777256e0531d40923971422f71cd8f66b8bbb2595e083f238bb0
|