Creación y Gestión de Notas con SQLAlchemy y Vistas en Python
Clase 7 de 18 • Curso de Flask
Resumen
La gestión de datos en aplicaciones web es un componente fundamental para crear experiencias interactivas y funcionales. En este artículo, exploraremos cómo implementar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) en una aplicación Flask utilizando SQLAlchemy, centrándonos específicamente en la creación y visualización de notas. Dominar estas técnicas te permitirá desarrollar aplicaciones web robustas con persistencia de datos, una habilidad esencial para cualquier desarrollador web moderno.
¿Cómo implementar la funcionalidad de notas en nuestra aplicación?
Ahora que nuestra tabla "note" tiene una estructura definida y permite la creación de nuevos registros, es momento de utilizar nuestro modelo para interactuar con la base de datos. El modelo de nota incluye varios métodos que nos permiten crear, actualizar y listar todas las notas almacenadas.
Para comenzar, necesitamos modificar nuestra vista principal (home) para mostrar las notas desde la base de datos en lugar de usar datos estáticos. Anteriormente teníamos un reto pendiente: convertir las notas de simples strings a objetos con propiedades.
# Antes
@app.route('/')
def home():
notes = ["Nota 1", "Nota 2", "Nota 3"]
role = "admin"
return render_template('index.html', notes=notes, role=role)
# Después
@app.route('/')
def home():
notes = [
{"title": "título de prueba", "content": "content de prueba"}
]
return render_template('index.html', notes=notes)
También necesitamos actualizar nuestro archivo HTML para que sea compatible con la nueva estructura de objetos:
{% for note in notes %}
<li>
{{ note.title }}
<br>
{{ note.content }}
</li>
{% else %}
<p>Aún no se han creado notas.</p>
{% endfor %}
<a href="{{ url_for('create_note') }}">Agregar una nueva nota</a>
La implementación del bloque else
dentro del bucle for
es una característica poderosa de Jinja2 que nos permite mostrar un mensaje alternativo cuando la lista está vacía, mejorando así la experiencia del usuario.
¿Cómo crear el formulario para añadir nuevas notas?
Para permitir a los usuarios crear nuevas notas, necesitamos un formulario adecuado. Vamos a modificar nuestro formulario existente para incluir campos tanto para el título como para el contenido:
<form method="POST">
<label for="title">Título</label>
<input type="text" name="title" id="title">
<br>
<label for="content">Contenido</label>
<input type="text" name="content" id="content">
<br>
<button type="submit">Crear nota</button>
</form>
Este formulario enviará los datos mediante el método POST a nuestra ruta de creación de notas.
¿Cómo guardar las notas en la base de datos?
La parte más importante es la lógica para guardar las notas en la base de datos. Necesitamos modificar nuestra función create_note
para capturar los datos del formulario y almacenarlos:
@app.route('/create', methods=['GET', 'POST'])
def create_note():
if request.method == 'POST':
title = request.form.get('title', '')
content = request.form.get('content', '')
note_db = Note(title=title, content=content)
db.session.add(note_db)
db.session.commit()
return redirect(url_for('home'))
return render_template('create.html')
Este código realiza varias operaciones clave:
- Obtiene los datos del formulario (título y contenido)
- Crea una nueva instancia del modelo Note con esos datos
- Añade la nota a la sesión de la base de datos
- Confirma la transacción con
commit()
- Redirige al usuario a la página principal
Es importante destacar el uso de db.session.commit()
, que confirma los cambios en la base de datos. Podríamos realizar múltiples operaciones (añadir varias notas) antes de hacer commit, lo que optimizaría el rendimiento en operaciones por lotes.
¿Cómo mostrar las notas desde la base de datos?
Para mostrar las notas almacenadas en la base de datos, necesitamos modificar nuestra función home
para consultar la base de datos:
@app.route('/')
def home():
notes = Note.query.all() # Obtiene todas las notas de la base de datos
return render_template('index.html', notes=notes)
Con esta modificación, ahora estamos obteniendo todas las notas directamente desde la base de datos y pasándolas a nuestra plantilla. SQLAlchemy se encarga de convertir los registros de la base de datos en objetos Python, lo que facilita enormemente el trabajo con ellos en nuestras plantillas.
¿Cómo mejorar la funcionalidad de nuestra aplicación?
Una mejora importante sería añadir el ID de cada nota en la lista para poder identificarlas fácilmente. Esto será especialmente útil cuando implementemos la funcionalidad de edición:
{% for note in notes %}
<li>
ID: {{ note.id }} - {{ note.title }}
<br>
{{ note.content }}
</li>
{% else %}
<p>Aún no se han creado notas.</p>
{% endfor %}
Mostrar el ID es el primer paso para implementar operaciones más avanzadas como la edición y eliminación de notas, ya que necesitaremos identificar de manera única cada nota para realizar estas acciones.
La implementación de operaciones CRUD en aplicaciones web con Flask y SQLAlchemy es un proceso estructurado que permite crear aplicaciones robustas con persistencia de datos. Siguiendo estos pasos, has aprendido a crear y mostrar notas en una aplicación web, sentando las bases para funcionalidades más avanzadas como la edición y eliminación. ¿Qué otras funcionalidades te gustaría implementar en tu aplicación de notas? Comparte tus ideas en los comentarios y continúa expandiendo tus conocimientos en desarrollo web.