Cómo crear una aplicación web Reflex avanzada de varias páginas con base de datos en tiempo real, gestión de estado dinámico y interfaz de usuario reactiva

En este tutorial, creamos una aplicación web Reflex avanzada completamente en Python que se ejecuta sin problemas dentro de Colab. Diseñamos la aplicación para demostrar cómo Reflex permite el desarrollo completo sin JavaScript, solo código Python reactivo. Creamos un panel completo de administración de notas con dos páginas, interacciones de bases de datos en tiempo real, filtrado, clasificación, análisis y personalización del usuario. Construimos progresivamente el proyecto en cinco fragmentos limpios, que cubren instalación, configuración, gestión de modelo y estado, diseño de interfaz de usuario y ejecución final, lo que nos proporciona una comprensión práctica de la arquitectura declarativa y el sistema de reactividad de Reflex. Consulta los CÓDIGOS COMPLETOS aquí.

importar sistema operativo, subproceso, sys, pathlib APP = “reflex_colab_advanced” os.makedirs(APP, exist_ok=True) os.chdir(APP) subprocess.run([sys.executable, “-m”, “pip”, “install”, “-q”, “reflex==0.5.9”])

Configuramos nuestro entorno de trabajo e instalamos Reflex dentro de Colab. Creamos un nuevo directorio de proyecto y nos aseguramos de que el marco esté listo para su uso. Preparamos el entorno base para que nuestra aplicación pueda ejecutarse sin problemas más adelante sin problemas de dependencia. Consulta los CÓDIGOS COMPLETOS aquí.

rxconfig = “”” importar reflejo como clase rx Config(rx.Config): app_name = “reflex_colab_advanced” db_url = “sqlite:///reflex.db” config = Config() “”” pathlib.Path(“rxconfig.py”).write_text(rxconfig)

Definimos el archivo de configuración que especifica el nombre de la aplicación y la conexión a la base de datos. Conectamos Reflex a una base de datos SQLite local para almacenar nuestras notas. Mantenemos esta configuración lo más mínima posible y al mismo tiempo seguimos siendo esenciales para administrar datos persistentes. Consulta los CÓDIGOS COMPLETOS aquí.

app_py = “”” importar reflejo como clase rx Nota(rx.Model, table=True): contenido: str etiqueta: str = “general” hecho: bool = False clase Estado(rx.State): usuario: str = “” buscar: str = “” tag_filter: str = “all” sort_desc: bool = True new_content: str = “” new_tag: str = “general” roast_msg: str = “” def set_user(self, v: str): self.user = v def set_search(self, v: str): self.search = v def set_tag_filter(self, v: str): self.tag_filter = v def set_new_content(self, v: str): self.new_content = v def set_new_tag(self, v: str): self.new_tag = v def toggle_sort(self): self.sort_desc = no self.sort_desc async def add_note(self): if self.new_content.strip(): await Note.create(content=self.new_content.strip(), tag=self.new_tag.strip() o “general”) self.new_content = “”; self.toast_msg = “Nota agregada” async def toggle_done(self, note_id: int): note = await Note.get(id=note_id) if nota: await note.update(done=not note.done) async def delete_note(self, note_id: int): await Note.delete(id=note_id) self.toast_msg = “Eliminado” async def clear_done(self): items = await Note.all() para n en elementos: if n.done: await Note.delete(id=n.id) self.toast_msg = “Borrado hecho notas” async def notes_filtered(self): elementos = await Note.all() q = self.search.lower() if q: elementos = [n for n in items if q in n.content.lower() or q in n.tag.lower()]
si self.tag_filter! = “todos”: elementos = [n for n in items if n.tag == self.tag_filter]
items.sort(key=lambda n: n.id, reverse=self.sort_desc) devolver elementos async def stats(self): items = await Note.all() total = len(items) done = len([n for n in items if n.done]) etiquetas = {} para n en elementos: etiquetas[n.tag] = etiquetas.get(n.etiqueta, 0) + 1 top_tags = ordenado(etiquetas.items(), clave=lambda x: x[1]reverso=Verdadero)[:5]
return {“total”: total, “hecho”: hecho, “pendiente”: total – hecho, “etiquetas”: top_tags} “””

Definimos nuestro modelo de datos Note y la clase State reactiva que controla la entrada del usuario, el filtrado y las operaciones de la base de datos. Gestionamos acciones asincrónicas, como agregar, eliminar y actualizar notas. También incluimos lógica para calcular estadísticas dinámicamente a partir de datos almacenados. Consulta los CÓDIGOS COMPLETOS aquí.

app_py += “”” def sidebar(): return rx.vstack( rx.heading(“RC Advanced”, size=”6″), rx.link(“Dashboard”, href=”https://www.marktechpost.com/”), rx.link(“Notes Board”, href=”http://www.marktechpost.com/board”), rx.text(“Usuario”), rx.input(placeholder=”su name”, value=State.user, on_change=State.set_user), spacing=”3″, width=”15rem”, padding=”1rem”, border_right=”1px solid #eee” ) async def stats_cards(): s = await State.stats() return rx.hstack( rx.box(rx.text(“Total”), rx.heading(str(s[“total”]), size=”5″), padding=”1rem”, border=”1px solid #eee”, border_radius=”0.5rem”), rx.box(rx.text(“Listo”), rx.heading(str(s[“done”]), size=”5″), padding=”1rem”, border=”1px solid #eee”, border_radius=”0.5rem”), rx.box(rx.text(“Pendiente”), rx.heading(str(s[“pending”]), size=”5″), padding=”1rem”, border=”1px solid #eee”, border_radius=”0.5rem”), spacing=”4″ ) def tag_pill(tag: str, count: int = 0): return rx.badge( f”{tag} ({count})” si cuenta la etiqueta else, on_click=State.set_tag_filter(tag), cursor=”pointer”, color_scheme=”blue” si la etiqueta == State.tag_filter else “gris” ) async def tags_bar(): s = await State.stats() etiquetas = [(“all”, s[“total”])]+ s[“tags”]
devolver rx.hstack(*[tag_pill(t[0]t[1]) para t en etiquetas]espaciado=”2″, wrap=”wrap”) def note_row(nota: Nota): return rx.hstack( rx.hstack( rx.checkbox(is_checked=note.done, on_change=State.toggle_done(note.id)), rx.text(note.content, text_decoration=”line-through” if note.done else “none”),), rx.badge(note.tag, color_scheme=”green”), rx.button(“🗑”, on_click=State.delete_note(note.id), color_scheme=”red”, size=”1″), justify=”between”, width=”100%” ) async def notes_list(): items = await State.notes_filtered() return rx.vstack(*[note_row(n) for n in items]espaciado=”2″, ancho=”100%”) “””

Diseñamos componentes de interfaz de usuario modulares, incluida la barra lateral, filtros de etiquetas y filas de notas individuales. Usamos elementos Reflex como vstack, hstack y suspense para crear diseños responsivos. Nos aseguramos de que cada elemento de la interfaz de usuario refleje directamente los cambios de estado en tiempo real. Consulta los CÓDIGOS COMPLETOS aquí.

app_py += “”” def Dashboard_page(): return rx.hstack( sidebar(), rx.box( rx.heading(“Dashboard”, size=”8″), rx.cond(State.user != “”, rx.text(f”Hola, {State.user}, aquí está tu actividad”)), rx.vstack( rx.suspense(stats_cards, fallback=rx.text(“Cargando estadísticas…”)), rx.suspense(tags_bar, fallback=rx.text(“Cargando etiquetas…”)), spacing=”4″ ), padding=”2rem”, ancho=”100%” ), ancho=”100%” ) def board_page(): return rx.hstack( sidebar(), rx.box( rx.heading(“Tablero de notas”, size=”8″), rx.hstack( rx.input(placeholder=”search…”, value=State.search, on_change=State.set_search, width=”50%”), rx.button(“Alternar orden”, on_click=State.toggle_sort), rx.button(“Borrar hecho”, on_click=State.clear_done, color_scheme=”red”), spacing=”2″ ), rx.hstack( rx.input(placeholder=”nota contenido”, valor=State.new_content, on_change=State.set_new_content, width=”60%”), rx.input(placeholder=”tag”, value=State.new_tag, on_change=State.set_new_tag, width=”20%”), rx.button(“Agregar”, on_click=State.add_note), espaciado=”2″ ), rx.cond(State.toast_msg != “”, rx.callout(State.toast_msg, icon=”info”)), rx.suspense(notes_list, fallback=rx.text(“Cargando notas…”)), padding=”2rem”, ancho=”100%” ), ancho=”100%” ) app = rx.App() app.add_page(dashboard_page, route=”https://www.marktechpost.com/”, title=”RC Dashboard”) app.add_page(board_page, route=”/board”, title=”Notes Board”) app.compile() “”” pathlib.Path(“app.py”).write_text(app_py) subprocess.run([“reflex”, “run”, “–env”, “prod”, “–backend-only”]marcar = Falso)

Finalmente, ensamblamos el tablero y las páginas del tablero y compilamos toda la aplicación Reflex. Agregamos navegación, campos de entrada, botones y estadísticas en vivo para crear una interfaz totalmente interactiva. Concluimos ejecutando el servidor backend, dando vida a nuestra aplicación Reflex avanzada.

En conclusión, desarrollamos y ejecutamos una aplicación Reflex con todas las funciones que integra lógica con estado, componentes dinámicos y una base de datos SQLite persistente, todo desde Python. Somos testigos de la facilidad con la que podemos definir el comportamiento tanto del frontend como del backend utilizando un marco reactivo unificado. A través de este proceso paso a paso, obtenemos información práctica sobre cómo administrar actualizaciones de estado asincrónicas, componer elementos de la interfaz de usuario de forma declarativa y ampliar la aplicación con navegación y análisis de varias páginas.

Consulta los CÓDIGOS COMPLETOS aquí. No dude en consultar nuestra página de GitHub para tutoriales, códigos y cuadernos. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 100.000 ML y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.

Asif Razzaq es el director ejecutivo de Marktechpost Media Inc.. Como empresario e ingeniero visionario, Asif está comprometido a aprovechar el potencial de la inteligencia artificial para el bien social. Su esfuerzo más reciente es el lanzamiento de una plataforma de medios de inteligencia artificial, Marktechpost, que se destaca por su cobertura en profundidad del aprendizaje automático y las noticias sobre aprendizaje profundo que es técnicamente sólida y fácilmente comprensible para una amplia audiencia. La plataforma cuenta con más de 2 millones de visitas mensuales, lo que ilustra su popularidad entre el público.

🙌 Siga MARKTECHPOST: agréguenos como fuente preferida en Google.