Cómo Crear un Sistema Web CRUD en Python: Guía Paso a Paso

Imagen generada con koboldcpp

En el desarrollo web, los sistemas CRUD (Crear, Leer, Actualizar, Eliminar) son fundamentales para gestionar datos. Python, gracias a su simplicidad y potentes frameworks como Flask y Django, es ideal para construir aplicaciones CRUD rápidamente.

En este artículo, aprenderás a crear un sistema CRUD básico usando Flask (un microframework ligero) y una base de datos SQLite. Además, destacaremos las partes críticas donde debes tener especial cuidado para evitar errores comunes.

🔹 Requisitos Previos Antes de empezar, necesitas:

  • Python 3.8 o superior instalado.
  • Conocimientos básicos de Python y
  • Un editor de código como VS Code o PyCharm.

Instala Flask con el siguiente comando:

pip install flask

🔹 Paso 1: Configuración Inicial del Proyecto

Crea una carpeta para tu proyecto y dentro de ella, un archivo llamado app.py.

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)

# Base de datos temporal (en memoria)
tasks = []

@app.route('/')
def index():
    return render_template('index.html', tasks=tasks)

if __name__ == '__main__':
    app.run(debug=True)

📌 Cuidado aquí:

Asegúrate de que Flask esté correctamente instalado. El modo debug=True es útil en desarrollo, pero nunca lo uses en producción.


🔹 Paso 2: Crear las Plantillas HTML

Flask usa Jinja2 para renderizar plantillas. Crea una carpeta llamada templates y dentro, un archivo index.html:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sistema CRUD con Flask</title>
</head>
<body>
    <h1>Lista de Tareas</h1>
    <form action="/add" method="POST">
        <input type="text" name="task" placeholder="Nueva tarea" required>
        <button type="submit">Agregar</button>
    </form>
    <ul>
        {% for task in tasks %}
        <li>
            {{ task }}
            <a href="/delete/{{ loop.index0 }}">Eliminar</a>
        </li>
        {% endfor %}
    </ul>
</body>
</html>

📌 Cuidado aquí:

Usa method="POST" en formularios que modifican datos.

Siempre valida los datos en el backend para evitar inyecciones maliciosas.

🔹 Paso 3: Implementar las Operaciones CRUD

🔸 Crear (Create) Añade esta ruta a app.py:

@app.route('/add', methods=['POST'])
def add():
    task = request.form.get('task')
    if task:
        tasks.append(task)
    return redirect(url_for('index'))

📌 Cuidado aquí:

Siempre verifica que los datos no estén vacíos (if task:).

🔸 Eliminar (Delete) Agrega esta función para borrar tareas:

@app.route('/delete/<int:task_id>')
def delete(task_id):
    if 0 <= task_id < len(tasks):
        tasks.pop(task_id)
    return redirect(url_for('index'))

📌 Cuidado aquí:

Valida que el task_id esté dentro del rango para evitar errores.

🔸 Actualizar (Update) Para editar tareas, añade:

@app.route('/edit/<int:task_id>', methods=['GET', 'POST'])
def edit(task_id):
    if request.method == 'POST':
        new_task = request.form.get('task')
        if new_task and 0 <= task_id < len(tasks):
            tasks[task_id] = new_task
            return redirect(url_for('index'))
    return render_template('edit.html', task=tasks[task_id], task_id=task_id)

Crea templates/edit.html:

<form action="/edit/{{ task_id }}" method="POST">
    <input type="text" name="task" value="{{ task }}" required>
    <button type="submit">Actualizar</button>
</form>

📌 Cuidado aquí:

Usa methods=['GET', 'POST'] para manejar ambas solicitudes.

Protege contra Cross-Site Request Forgery (CSRF) en producción.


🔹 Paso 4: Usar una Base de Datos SQLite

Para persistencia de datos, reemplaza la lista tasks con SQLite:

import sqlite3
from flask import g

DATABASE = 'database.db'

def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DATABASE)
    return db

@app.teardown_appcontext
def close_db(error):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()

def init_db():
    with app.app_context():
        db = get_db()
        cursor = db.cursor()
        cursor.execute('CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY, task TEXT)')
        db.commit()

📌 Cuidado aquí:

Cierra siempre las conexiones a la base de datos (close_db).

Usa consultas parametrizadas para evitar SQL Injection.


🔹 Paso 5: Despliegue Seguro

Si subes tu app a producción:

Usa Gunicorn o Waitress en lugar del servidor de desarrollo.

Configura HTTPS para seguridad.

Evita almacenar contraseñas en el código (usa variables de entorno).


🔹 Conclusión Hemos creado un sistema CRUD en Python con Flask, desde la configuración inicial hasta el manejo de una base de datos SQLite. Las partes más críticas son: ✅ Validación de datos.

✅ Manejo seguro de la base de datos.

✅ Protección contra CSRF y SQL Injection.

Este proyecto es un excelente punto de partida para aplicaciones más complejas. ¿Qué funcionalidades añadirías? ¡Déjanos tus comentarios!

📢 ¿Te gustó el artículo? Compártelo en redes sociales y síguenos para más tutoriales de Python y desarrollo web. 🚀

Artículos Relacionados

Comentarios