Tuesday, October 14, 2025

Constructing Pure Python Net Apps with Reflex


Constructing Pure Python Net Apps with ReflexPicture by Creator

 

After we speak about Python, we regularly consider using it to carry out information evaluation or construct a machine studying mannequin. It’s much less widespread to debate creating full net purposes with Python outdoors of easy prototypes utilizing libraries corresponding to Streamlit or Taipy.

Nonetheless, a library known as Reflex presents net software growth options that compete with these of different programming languages. Solely in Python, this open-source library helps customers construct something from small information science apps to massive, multi-page web sites. With robust flexibility but intuitive Python code, we are able to simply scale net growth to swimsuit our wants with Reflex.

On this article, we’ll study the fundamentals of constructing a pure Python net software with Reflex.

 

Constructing Net Apps with Reflex

 
On this tutorial, we’ll evaluation the requirements for constructing an internet software with Reflex. For finest practices, it’s advisable to make use of a digital surroundings to keep away from disrupting the general surroundings.

With this in thoughts, we’ll start growing our Reflex net software by putting in the Reflex library utilizing the code under:

 

We are going to then check Reflex by creating a brand new undertaking and initiating a brand new software. Use the next code, however change the test_app folder identify to your individual.

mkdir test_app
cd test_app
reflex init

 

The code above prompts you with questions on whether or not you wish to create the undertaking with a pre-made template or not.

 
Building Pure Python Web Apps with ReflexBuilding Pure Python Web Apps with Reflex
 

For this tutorial, choose the clean Reflex app, and you will notice the brand new undertaking construction created, just like the one under.

 
Building Pure Python Web Apps with ReflexBuilding Pure Python Web Apps with Reflex
 

Run the next command to see in case your Reflex software runs correctly:

 

Go to the native URL serving the applying. If it really works nicely, you will notice one thing just like the picture under:

 
Building Pure Python Web Apps with ReflexBuilding Pure Python Web Apps with Reflex
 

That is the essential net software scaffold generated by Reflex. We are going to construct one thing extra subtle later, however we’ll begin with the basics.

Let’s begin by understanding the elements used to construct the online software within the Reflex library. First, open

test_app.py and substitute its contents with the next code:

import reflex as rx

class State(rx.State):
    depend: int = 0

    def increment(self):
        self.depend += 1

    def decrement(self):
        self.depend -= 1

def index():
    return rx.hstack(
        rx.button(
            "Decrement",
            color_scheme="ruby",
            on_click=State.decrement,
        ),
        rx.heading(State.depend, font_size="2em"),
        rx.button(
            "Increment",
            color_scheme="grass",
            on_click=State.increment,
        ),
        spacing="4",
    )

app = rx.App()
app.add_page(index)

 

It will present a web site just like the one under.

 
Building Pure Python Web Apps with ReflexBuilding Pure Python Web Apps with Reflex
 

Let’s break down what’s taking place within the code above.

First, we outline the state, which accommodates variables (known as vars) and features (known as occasion handlers) that may change the state of the applying.

For instance, we outline a single variable known as depend that holds an integer with an preliminary worth of 0.

class State(rx.State):
    depend: int = 0

 

Then we have now occasion handlers—features throughout the state that modify variables in response to person actions. Within the code above, we outline the occasion handlers as follows:

def increment(self):
    self.depend += 1

def decrement(self):
    self.depend -= 1

 
Subsequent, we outline the online software UI as follows:

def index():
    return rx.hstack(
        rx.button(
            "Decrement",
            color_scheme="ruby",
            on_click=State.decrement,
        ),
        rx.heading(State.depend, font_size="2em"),
        rx.button(
            "Increment",
            color_scheme="grass",
            on_click=State.increment,
        ),
        spacing="4",
    )

 

The features above outline the online software interface and use the next elements to construct the UI:

  • rx.hstack: used to stack parts horizontally
  • rx.button: used to indicate a button that triggers an occasion when clicked
  • rx.heading: used to indicate textual content in numerous sizes

As you may see within the code above, the heading element references the depend variable within the state, and every button triggers a operate within the state when clicked.

There are various extra elements you need to use to construct the online software; see the Reflex elements documentation.

Lastly, we outline the applying and add the elements to the bottom route with the next code:

app = rx.App()
app.add_page(index)

 

That could be a easy clarification of the necessary elements that Reflex makes use of to construct an internet software.

With the reason above completed, let’s construct a barely extra superior net software with Reflex. Within the instance under, we’ll develop a to-do listing software that we are able to fill and take away objects from.

import uuid
import reflex as rx
from typing import Any, Dict, Checklist

class TodoState(rx.State):
    todos: Checklist[Dict[str, Any]] = []
    new_text: str = ""
    current_filter: str = "all"   # Choose between "all", "energetic", "completed"

    # Derived values (computed from state)
    @rx.var
    def items_left(self) -> int:
        return sum(1 for t in self.todos if not t["done"])

    @rx.var
    def items_left_label(self) -> str:
        return "1 merchandise left" if self.items_left == 1 else f"{self.items_left} objects left"

    @rx.var
    def filtered_todos(self) -> Checklist[Dict[str, Any]]:
        if self.current_filter == "energetic":
            return [t for t in self.todos if not t["done"]]
        if self.current_filter == "completed":
            return [t for t in self.todos if t["done"]]
        return self.todos

    # Occasions (mutate state)
    @rx.occasion
    def set_new_text(self, worth: str):
        self.new_text = (worth or "").strip()

    @rx.occasion
    def add_todo(self):
        textual content = (self.new_text or "").strip()
        if not textual content:
            return
        self.todos.append({"id": str(uuid.uuid4()), "textual content": textual content, "completed": False})
        self.new_text = ""

    @rx.occasion
    def toggle(self, todo_id: str):
        for t in self.todos:
            if t["id"] == todo_id:
                t["done"] = not t["done"]
                break

    @rx.occasion
    def take away(self, todo_id: str):
        self.todos = [t for t in self.todos if t["id"] != todo_id]

    @rx.occasion
    def clear_completed(self):
        self.todos = [t for t in self.todos if not t["done"]]

    @rx.occasion
    def set_filter(self, identify: str):
        if identify in {"all", "energetic", "completed"}:
            self.current_filter = identify

def filter_button(identify: str, label: str) -> rx.Element:
    return rx.button(
        label,
        dimension="2",
        variant=rx.cond(TodoState.current_filter == identify, "stable", "gentle"),
        background_color=rx.cond(
            TodoState.current_filter == identify, "blue.600", "grey.700"
        ),
        colour="white",
        _hover={"background_color": "blue.500"},
        on_click=lambda: TodoState.set_filter(identify),
    )

def render_todo_item(todo: rx.Var[dict]) -> rx.Element:
    return rx.hstack(
        rx.checkbox(
            is_checked=todo["done"],
            on_change=lambda _: TodoState.toggle(todo["id"]),
            dimension="2",
            color_scheme="blue",
        ),
        rx.textual content(
            todo["text"],
            flex="1",
            colour=rx.cond(todo["done"], "grey.500", "white"),
            text_decoration=rx.cond(todo["done"], "line-through", "none"),
        ),
        rx.icon_button(
            "trash",
            color_scheme="purple",
            variant="gentle",
            on_click=lambda: TodoState.take away(todo["id"]),
        ),
        align="middle",
        spacing="3",
        width="100%",
    )

def todo_input_bar() -> rx.Element:
    return rx.hstack(
        rx.enter(
            placeholder="What must be completed?",
            worth=TodoState.new_text,
            on_change=TodoState.set_new_text,
            flex="1",
            dimension="3",
            background_color="grey.800",
            colour="white",
            border_color="grey.600",
            _placeholder={"colour": "grey.400"},
        ),
        rx.button(
            "Add",
            dimension="3",
            background_color="blue.600",
            colour="white",
            _hover={"background_color": "blue.500"},
            on_click=TodoState.add_todo,
        ),
        spacing="3",
        width="100%",
    )

def todo_list_panel() -> rx.Element:
    return rx.vstack(
        rx.foreach(TodoState.filtered_todos, render_todo_item),
        spacing="2",
        width="100%",
    )

def footer_bar() -> rx.Element:
    return rx.hstack(
        rx.textual content(TodoState.items_left_label, dimension="2", colour="grey.300"),
        rx.hstack(
            filter_button("all", "All"),
            filter_button("energetic", "Lively"),
            filter_button("completed", "Accomplished"),
            spacing="2",
        ),
        rx.button(
            "Clear Accomplished",
            variant="gentle",
            background_color="grey.700",
            colour="white",
            _hover={"background_color": "grey.600"},
            on_click=TodoState.clear_completed,
        ),
        justify="between",
        align="middle",
        width="100%",
    )

def index() -> rx.Element:
    return rx.middle(
        rx.card(
            rx.vstack(
                rx.heading("Reflex To-Do", dimension="6", colour="white"),
                todo_input_bar(),
                rx.separator(border_color="grey.700"),
                todo_list_panel(),
                rx.separator(margin_y="2", border_color="grey.700"),
                footer_bar(),
                width="min(720px, 92vw)",
                spacing="4",
            ),
            dimension="4",
            width="min(760px, 96vw)",
            shadow="lg",
            background_color="grey.900",
        ),
        min_h="100vh",
        padding_y="8",
        background_color="black",
    )

app = rx.App()
app.add_page(index, route="https://www.kdnuggets.com/", title="Reflex To-Do")

 

The results of the applying will appear like the picture under.

 
Building Pure Python Web Apps with ReflexBuilding Pure Python Web Apps with Reflex
 

Within the code above, the movement primarily works as follows:

  1. The app retains a small reminiscence: your duties, what you’re typing, and which filter is chosen.
  2. You sort within the field and that textual content is saved as you sort.
  3. You press “Add” and the duty is saved (with an id) and the field clears.
  4. The listing immediately refreshes to indicate what’s in reminiscence.
  5. Every process row has a checkbox and a trash icon. Checking toggles completion; the trash removes the duty.
  6. The three filter buttons (All / Lively / Accomplished) change which duties are seen.
  7. The footer reveals what number of duties are usually not completed and allows you to “Clear Accomplished”.

A number of necessary distinctions—past the essential elements lined earlier—embody:

  1. Enhance with @rx.occasion to declare occasions throughout the state.
  2. Enhance with @rx.var to create derived variables within the state.
  3. Use rx.Element signatures when constructing reusable UI helpers on your Reflex software.

That’s the primary clarification and instance of how Reflex works. Attempt it your self and construct the online software you want with pure Python.

 

Conclusion

 
Reflex is an open-source library that permits us to construct net purposes in pure Python with a easy but intuitive code sample. Its simple setup and easy-to-understand code permit customers to maintain the logic and UI in a single place. It’s a helpful library for newcomers {and professional} builders alike who wish to construct an software with Python.

I hope this has helped!
 
 

Cornellius Yudha Wijaya is an information science assistant supervisor and information author. Whereas working full-time at Allianz Indonesia, he likes to share Python and information suggestions by way of social media and writing media. Cornellius writes on quite a lot of AI and machine studying matters.

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles

PHP Code Snippets Powered By : XYZScripts.com