Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

CRUD: Actualización Python: Desarrollo web con Flask

En esta lección, aprenderemos a actualizar una entidad (como una escuela) en una app de Flask. Ya viste cómo crear una, ¿verdad? Ahora, actualizar es similar, pero con algunos pasos extra.

Vamos a hacerlo fácil y paso a paso: primero veremos cómo mostrar un formulario para editar y luego cómo procesarlo cuando se envíe.


¿Qué es "actualizar una entidad"?

Cuando hablamos de entidad, nos referimos a un objeto del mundo real que nuestra app maneja, como una escuela, un estudiante o un curso. Actualizar es simplemente cambiar parte de su información, por ejemplo, corregir el nombre de una escuela.

Actualizar una entidad tiene dos partes:

1️⃣ Mostrar la información actual de la entidad en un formulario (para editar).

2️⃣ Recibir ese formulario ya editado y guardar los cambios.


Paso 1: Mostrar el Formulario de Edición

Para empezar, necesitamos un formulario que muestre los datos actuales de la entidad (en este caso la escuela), y permita modificarlos.

Ruta para ver el formulario de edición

@app.route('/schools/<id>/edit')
def schools_edit(id):
    repo = SchoolRepository()       # Repositorio que accede a los datos
    school = repo.find(id)          # Buscamos la escuela por su ID
    errors = []                     # Inicializamos lista de errores vacía

    # Renderizamos el formulario de edición pasando la escuela encontrada
    return render_template(
        'schools/edit.html',
        school=school,
        errors=errors
    )

Código HTML de la plantilla de edición (edit.html)

<form action="{{ url_for('schools_patch', id=school.id) }}" method="post">
    <div>
        <label>
            Nombre *
            <input type="text" name="name" value="{{ school.name }}">
        </label>
        {% if errors %}
            <div>{{ errors.name }}</div>
        {% endif %}
    </div>
    <input type="submit" value="Actualizar">
</form>
  • Este formulario llena automáticamente el campo "Nombre" con el valor actual de la escuela.
  • Si hay errores, se muestran justo debajo del campo.

Paso 2: Procesar el Formulario y Guardar Cambios

Después de que el usuario envía el formulario, necesitamos procesar esos datos:

  1. Validar que los datos sean correctos.
  2. Actualizar los valores en el objeto escuela.
  3. Guardar los nuevos datos en la base.
  4. Redirigir al usuario o mostrar errores si los hay.

Ruta que recibe los datos del formulario

@app.route('/schools/<id>/patch', methods=['POST'])
def schools_patch(id):
    repo = SchoolRepository()
    school = repo.find(id)
    data = request.form.to_dict()   # Convertimos los datos recibidos a diccionario

    errors = validate(data)
    if errors:
        # Si hay errores, volvemos a mostrar el formulario con errores
        return render_template(
            'schools/edit.html',
            school=school,
            errors=errors
        ), 422

    # Asignamos manualmente los nuevos valores
    school['name'] = data['name']

    repo.save(school)   # Guardamos los cambios en la base de datos

    flash('La escuela ha sido actualizada', 'success')
    return redirect(url_for('schools_index'))
¿Por qué hacemos la asignación manual?

Podrías pensar: “¿por qué no reemplazamos todo de una vez con school = data?”. El problema es que eso sería inseguro. Un usuario malicioso podría enviar datos que no queremos que cambien (como el ID o cosas delicadas). Por eso, asignamos solo los campos que realmente permitimos editar.


Consideraciones sobre los Métodos HTTP

En una API bien diseñada, para actualizar usamos los métodos HTTP:

MétodoUsado para
POSTCrear una entidad
PUTActualizar toda la entidad
PATCHActualizar parte de la entidad

Sin embargo, HTML solo permite usar GET y POST en los formularios. Entonces usamos POST para todo, aunque semánticamente no sea del todo correcto. Para diferenciar las acciones, usamos rutas diferentes como:

  • /schools/<id>/edit – mostrar el formulario
  • /schools/<id>/patch – procesar los cambios

Este enfoque es un compromiso, porque Flask no decide el comportamiento del navegador. Solo gestiona cómo respondemos a una URL.


¿Por qué no usamos frameworks más grandes?

En frameworks más avanzados como Django o Rails, existen herramientas (como Form Builders) que hacen este trabajo automáticamente, asignando y validando campos de forma segura.

Pero como estamos usando Flask (que es más liviano), hacemos este proceso manualmente para tener control total y entender mejor lo que pasa.


Resumen

  • Actualizar una entidad implica mostrar un formulario con los datos actuales y luego guardar los cambios.
  • Usamos dos rutas: una para mostrar el formulario y otra para procesar los datos enviados.
  • La asignación de datos se hace manualmente por seguridad.
  • Aunque debería usarse PATCH o PUT para actualización, HTML solo permite GET y POST, así que usamos POST.
  • Flask maneja rutas, pero no el comportamiento del formulario; eso depende del navegador.

Trabajo independiente

  1. Implementa la actualización de usuarios.

Aplicación de referencia

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY