DEV Community

artydev
artydev

Posted on

FastHTML : A simple Counter updated server side

Here is a demo of a server side incremented counter. Note the use of htmx

from fasthtml.common import *

app, rt = fast_app(hdrs=(picolink), live=True, live_reload=True)

@rt("/inc")
def get (session):
    session['sum'] = session.get('sum') + 1
    return session["sum"]

@rt("/")
def get(session):
    session.setdefault('sum', 0)
    return (
       Div (    
            Div (
                Button("inc", hx_get="/inc", hx_target="#counter"),
                Div(session["sum"], id="counter", cls="sum"),
                cls="counter"
            ),
           StyleX("style.css"),
           cls = "wrap-counter"
        )
    )

serve()
Enter fullscreen mode Exit fullscreen mode
.wrap-counter {
    background-color: white;
    display: flex;
    justify-content: space-around;
    margin-top: 4rem;
}

.counter {
    display:flex;
    align-items:center;
    gap:2rem;
}

.sum {
    font-size: 2rem;
}
Enter fullscreen mode Exit fullscreen mode

Image description

Image description

FastHTML integrates HTMX and make updating any part of a web page a breeeze, without making Ajax request.

Here is the same app as it it figures in the documentation. It does not use session variable:

from fasthtml.common import *

app, rt = fast_app(hdrs=(picolink), live=True, live_reload=True)

count = 0

@app.get("/")
def home():
    return Title("Count Demo"), Main(
        H1("Count Demo"),
        P(f"Count is set to {count}", id="count"),
        Button("Increment", hx_post="/increment", hx_target="#count", hx_swap="innerHTML")
    )

@app.post("/increment")
def increment():
    print("incrementing")
    global count
    count += 1
    return f"Count is set to {count}"

serve()
Enter fullscreen mode Exit fullscreen mode

Top comments (0)