R

ReflexKR

Documentación de Reflex

Desarrollo web full stack con Python y Reflex

·

Resumen del curso

1

Conoce Reflex y prepara tu entorno

2

Dibujar la pantalla con componentes

3

State y Vars: que los datos dibujen la pantalla

4

Eventos y formularios: añadir clientes

5

Transformar datos y gráficos

6

Resumen, depuración y próximos pasos

·

Apéndice

Desarrollo web full stack con Python y Reflex
Lección 6

Tiempo 3:45–4:00

Resumen, depuración y próximos pasos

La app que has creado hoy funciona con un único ciclo: estado (State) → pantalla (Var) → evento (manejador) → cambio de estado. Por mucho que crezca una app de Reflex, lo único que hace es añadir más vueltas a este ciclo.

6-1. Lo que has aprendido hoy, en una tabla (5 min)

ConceptoEn el códigoLa frase que debes recordar
Componenterx.box(hijo, prop=valor)Los argumentos posicionales son hijos; los de palabra clave, propiedades
Páginaapp.add_page(index, on_load=...)Una página = una función
Stateclass State(rx.State)Anotación de tipo obligatoria; memoria del servidor por sesión
VarState.users.length()Dentro de una función de pantalla es una expresión, no un valor
Bucles y condicionesrx.foreach, rx.condEn lugar de for e if con Vars
Evento@rx.event def add_user(self, ...)La única forma de cambiar el estado; Python de verdad
Formulariorx.form(on_submit=...) + name=name es la clave de form_data
Componente controladoopen= + on_open_change=El setter lo defines tú (0.10)
computed var@rx.var def ...() -> tipoUn valor calculado a partir de otro estado
Gráficorx.recharts.bar_chart(data=...)Los datos son list[dict]

6-2. Errores frecuentes y cómo resolverlos (5 min)

SíntomaCausaSolución
TypeError: object of type '...Var' has no len()len() sobre una Var en una función de pantalla.length()
VarTypeError: Cannot convert Var ... to boolif / and / or sobre una Varrx.cond(...)
VarTypeError: Cannot iterate over Varfor sobre una Varrx.foreach(...)
AttributeError: ... has no attribute 'set_xxx'Dar por hecho que hay setters automáticos (materiales antiguos)Define el setter tú mismo con @rx.event
Se añaden datos aunque pulses el botón de cancelarDentro de un formulario, el type por defecto de un botón es submittype="button"
TypeError: __init__() got an unexpected keyword argumentEl name de un campo no coincide con el nombre del campo del dataclassHaz que los nombres sean idénticos
El diálogo no se abreHay open= pero falta on_open_changeÚsalos siempre juntos
El gráfico está vacíoNo hay ningún momento en que se rellenen los datos del gráficoRegistra on_load o usa una computed var

3 hábitos de depuración

  1. Mira primero los logs de la terminal del servidor. Las excepciones que se producen en un manejador a menudo no se notan en la pantalla y solo aparecen en la terminal.
  2. Comprueba antes con uv run reflex compile --dry. Sin arrancar el servidor, encuentra rápidamente errores de sintaxis y de Vars en el código de pantalla.
  3. Pon print() dentro de los manejadores. Los manejadores son Python que se ejecuta en el servidor, así que print(form_data) aparece en la terminal del servidor. Un print dentro de una función de pantalla solo se muestra una vez, al arrancar la app.

6-3. Retos de ampliación (deberes)

Están ordenados por dificultad. Cada reto profundiza en uno de los conceptos que has aprendido hoy.

  1. Botón de borrar: pon un icono de papelera (rx.icon("trash-2")) al final de cada fila y, al pulsarlo, borra ese cliente. Pista: pasa un argumento así, on_click=lambda: State.delete_user(user.email).
  2. Búsqueda: crea un campo de búsqueda por nombre, conéctalo con value= + on_change= (componente controlado) y muestra en la tabla la lista filtrada con una computed var. Prueba on_change=State.set_search.debounce(300) para que solo busque cuando se deje de escribir.
  3. Validación: si el email está duplicado o tiene un formato incorrecto, devuelve rx.toast.error y no cierres el diálogo.
  4. Almacenamiento persistente: crea una tabla Customer con SQLModel, léela en on_load y escribe en ella en add_user. Los clientes deben seguir ahí después de recargar la página o reiniciar el servidor. Se instala con uv add "reflex[db]", y en Reflex 0.10 se recomienda usar SQLModel directamente en lugar de rx.Model.

6-4. Qué aprender a continuación

  • Varias páginas y enrutamiento: crea rutas dinámicas como @rx.page(route="/customers/[id]") y añade una página de detalle del cliente.
  • Separar en archivos: divide el proyecto en models.py, state.py, components/ y pages/ para que siga siendo fácil de mantener a medida que crece.
  • Despliegue: comprueba el modo de producción con reflex run --env prod y despliega en Reflex Cloud o en tu propio servidor (Docker).
  • Documentación oficial: reflex.dev/docs. Las entradas de blog antiguas pueden usar APIs que han cambiado, como los setters automáticos, rx.Model o rx.App(theme=...), así que comprueba la versión antes de seguirlas.

← Anterior

Lección 5 · Transformar datos y gráficos

Siguiente →

Apéndice

Recibe avisos de nuevas lecciones

Te avisaremos por correo cuando este curso tenga lecciones nuevas o se abra un curso de continuación.

Datos: tu correo electrónico · Finalidad: avisos de nuevas lecciones o de la publicación de este curso · Conservación: hasta que pidas que lo borremos. No lo usamos para nada más ni lo compartimos. Responde a cualquier aviso y lo borraremos enseguida.

Preguntas y respuestas

Pregunta lo que quieras sobre esta lección. Aquí se reúnen las preguntas de todas las versiones de idioma de esta página.

Se muestra como texto plano, sin enlaces ni formato.

R

ReflexKR

Aprende Python y Reflex haciendo. Todos los ejemplos se ejecutaron y verificaron en Reflex 0.10.0.

ReflexKR es gratis y sin banners publicitarios. Si te ayudó, puedes apoyarlo con un café. ☕ Invítanos un café

Aviso de afiliados
한국어English日本語简体中文EspañolDeutsch

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex