Server side rendered, reactive web applications in python.
1 dependency (pydantic).
Features:
- stateless (HTTP) and stateful (websocket) sessions
- server to client updates
- integrated state management
- background workers
- routing and navigation
- partial page updates
- more...
Have a look at the Getting Started guide or check out the full documentation.
pip install rxxxtIf you want to run the application, you will have to install an ASGI web server like uvicorn (with [standard] to allow for websockets) as well:
pip install rxxxt uvicorn[standard]import uvicorn
from rxxxt import Component, El, Element, App, local_state
class Counter(Component):
count = local_state(int)
def on_click(self):
self.count += 1
def render(self) -> Element:
return El.div(onclick=self.on_click, content=[f"Count: {self.count}"])
app = App(Counter)
uvicorn.run(app)result.webm
import uvicorn
from fastapi import FastAPI, Response
from rxxxt import local_state, Component, El, Element, App, PageBuilder, VEl
class Counter(Component):
count = local_state(int)
def on_click(self):
self.count += 1
def render(self) -> Element:
return El.div(onclick=self.on_click, content=[f"Count: {self.count}"])
server = FastAPI()
@server.get("/main.css")
def get_css():
return Response("body { margin: 0; font-family: sans-serif; }", media_type="text/css")
page_builder = PageBuilder()
page_builder.add_header(VEl.link(rel="stylesheet", href="/main.css"))
app = App(Counter, page_factory=page_builder)
server.mount("/", app)
uvicorn.run(server)- after restarting python, your browser session will stop working (until you refresh), because your old state has been invalidated. Make sure to set
JWT_SECRETto avoid this.