routelit¶

routelit is a Python framework for building interactive web user interfaces that are framework-agnostic and easy to use. It allows you to create dynamic web applications with a simple, declarative API similar to Streamlit, but designed to work with any HTTP framework (Flask, FastAPI, Django, etc.).
β¨ Features¶
- Framework Agnostic: Works with any Python web framework (Flask, FastAPI, Django, etc.)
- Declarative UI: Build interfaces using simple Python functions
- Interactive Components: Buttons, forms, inputs, selects, checkboxes, and more
- State Management: Built-in session state management
- Reactive Updates: Automatic UI updates based on user interactions
- Fragment Support: Partial page updates for better performance
- Flexible Layouts: Containers, columns, flex layouts, and expandable sections
- Rich Content: Support for markdown, images, and custom styling
π Installation¶
Install routelit using pip:
pip install routelit
# or
uv add routelit
π Quick Start¶
Here's a simple example of how to use routelit with Flask:
uv add routelit-flask
from flask import Flask
from routelit import RouteLit, RouteLitBuilder
from routelit_flask import RouteLitFlaskAdapter
app = Flask(__name__)
rl = RouteLit()
rl_adapter = RouteLitFlaskAdapter(rl).configure(app)
def index_view(rl: RouteLitBuilder):
rl.text("Hello, World!")
@app.route("/", methods=["GET", "POST"])
def index():
return rl_adapter.response(index_view)
FastAPI¶
uv add routelit-fastapi
from fastapi import FastAPI, Request
from routelit import RouteLit, RouteLitBuilder
from routelit_fastapi import RouteLitFastAPIAdapter
app = FastAPI()
rl = RouteLit()
adapter = RouteLitFastAPIAdapter(rl).configure(app)
def index_view(rl: RouteLitBuilder):
rl.text("Hello, World!")
@app.api_route("/", methods=["GET", "POST"])
async def index(request: Request):
return await adapter.response(index_view, request)
# Or use the simplified decorator:
@adapter.route("/")
def index_view(rl: RouteLitBuilder):
rl.text("Hello, World!")
Django¶
uv add routelit-django
# views.py
from routelit import RouteLit, RouteLitBuilder
from routelit_django import RouteLitDjangoAdapter, DjangoSessionStorage
rl = RouteLit(session_storage=DjangoSessionStorage())
adapter = RouteLitDjangoAdapter(rl)
def index_view(rl: RouteLitBuilder):
rl.text("Hello, World!")
def index(request):
return adapter.response(index_view, request)
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
views.adapter.configure(urlpatterns)