%2011.32.25%E2%80%AFp.m..png)
📌 Proyecto 2: Gestión de Alumnos con Flask
En este artículo, te mostraré cómo desarrollamos “Proyecto 2”, una aplicación web en Python con Flask para gestionar alumnos. Permite agregar, editar y eliminar alumnos, almacenando la información en un archivo de texto (alumnos.txt) dentro de la carpeta Documentos/python/Proyecto2.
🔹 Tecnologías Utilizadas
• Python: Backend para manejar los datos.
• Flask: Framework web para la interfaz.
• HTML + Bootstrap: Diseño responsive y atractivo.
• OS (módulo de Python): Para gestionar archivos y rutas.
🔹 Objetivo del Proyecto
El sistema permite registrar alumnos, almacenando los siguientes datos:
✅ Nombre
✅ Edad
✅ Correo Electrónico
✅ Número de Materias
🔹 Funcionalidades
✅ Registrar un alumno
✅ Editar los datos de un alumno
✅ Eliminar un alumno
✅ Mostrar la lista de alumnos registrados
✅ Guardar la información en alumnos.txt
📌 Código Fuente Completo
🔹 Archivo app.py
from flask import Flask, render_template, request, redirect, url_for
import os
app = Flask(__name__)
# Ruta donde se guardará la información en Documentos/python/Proyecto2
documents_path = os.path.join(os.path.expanduser("~"), "Documents")
folder_path = os.path.join(documents_path, "python", "Proyecto2")
file_path = os.path.join(folder_path, "alumnos.txt")
# Crear la carpeta si no existe
if not os.path.exists(folder_path):
os.makedirs(folder_path)
# Funciones para leer y escribir alumnos
def leer_alumnos():
if not os.path.exists(file_path):
return []
with open(file_path, "r", encoding="utf-8") as file:
return [line.strip().split(",") for line in file.readlines()]
def escribir_alumnos(alumnos):
with open(file_path, "w", encoding="utf-8") as file:
for alumno in alumnos:
file.write(",".join(alumno) + "\n")
@app.route('/')
def index():
alumnos = leer_alumnos()
return render_template('index.html', alumnos=enumerate(alumnos))
@app.route('/agregar', methods=['POST'])
def agregar():
nombre = request.form['nombre']
edad = request.form['edad']
correo = request.form['correo']
materias = request.form['materias']
nuevo_alumno = [nombre, edad, correo, materias]
alumnos = leer_alumnos()
alumnos.append(nuevo_alumno)
escribir_alumnos(alumnos)
return redirect(url_for('index'))
@app.route('/editar/<int:index>', methods=['GET', 'POST'])
def editar(index):
alumnos = leer_alumnos()
if request.method == 'POST':
alumnos[index] = [
request.form['nombre'],
request.form['edad'],
request.form['correo'],
request.form['materias']
]
escribir_alumnos(alumnos)
return redirect(url_for('index'))
return render_template('editar.html', index=index, alumno=alumnos[index])
@app.route('/eliminar/<int:index>')
def eliminar(index):
alumnos = leer_alumnos()
alumnos.pop(index)
escribir_alumnos(alumnos)
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
🔹 Archivo templates/index.html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gestión de Alumnos</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light">
<div class="container mt-5">
<h2 class="text-center">Gestión de Alumnos</h2>
<form action="/agregar" method="POST" class="card p-4 shadow mb-4">
<div class="mb-3">
<label for="nombre" class="form-label">Nombre</label>
<input type="text" class="form-control" id="nombre" name="nombre" required>
</div>
<div class="mb-3">
<label for="edad" class="form-label">Edad</label>
<input type="number" class="form-control" id="edad" name="edad" required>
</div>
<div class="mb-3">
<label for="correo" class="form-label">Correo Electrónico</label>
<input type="email" class="form-control" id="correo" name="correo" required>
</div>
<div class="mb-3">
<label for="materias" class="form-label">Número de Materias</label>
<input type="number" class="form-control" id="materias" name="materias" required>
</div>
<button type="submit" class="btn btn-primary">Agregar Alumno</button>
</form>
<table class="table table-bordered">
<thead>
<tr>
<th>Nombre</th>
<th>Edad</th>
<th>Correo</th>
<th>Materias</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
{% for index, alumno in alumnos %}
<tr>
<td>{{ alumno[0] }}</td>
<td>{{ alumno[1] }}</td>
<td>{{ alumno[2] }}</td>
<td>{{ alumno[3] }}</td>
<td>
<a href="/editar/{{ index }}" class="btn btn-warning btn-sm">Editar</a>
<a href="/eliminar/{{ index }}" class="btn btn-danger btn-sm">Eliminar</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>
🔹 Archivo templates/editar.html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Editar Alumno</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light">
<div class="container mt-5">
<h2 class="text-center">Editar Alumno</h2>
<form action="/editar/{{ index }}" method="POST" class="card p-4 shadow">
<div class="mb-3">
<label class="form-label">Nombre</label>
<input type="text" class="form-control" name="nombre" value="{{ alumno[0] }}" required>
</div>
<div class="mb-3">
<label class="form-label">Edad</label>
<input type="number" class="form-control" name="edad" value="{{ alumno[1] }}" required>
</div>
<div class="mb-3">
<label class="form-label">Correo</label>
<input type="email" class="form-control" name="correo" value="{{ alumno[2] }}" required>
</div>
<div class="mb-3">
<label class="form-label">Materias</label>
<input type="number" class="form-control" name="materias" value="{{ alumno[3] }}" required>
</div>
<button type="submit" class="btn btn-primary">Guardar Cambios</button>
</form>
</div>
</body>
</html>
No hay comentarios