Esta ruta de aprendizaje te llevará paso a paso a entender y construir una aplicación CRUD (Crear, Leer, Actualizar, Eliminar) utilizando Flask, SQLAlchemy y PostgreSQL, con una interfaz web potenciada por Bootstrap.
proyecto-estudiantes/
├── app/
│ ├── __init__.py
│ ├── models.py
│ ├── routes.py
│ └── templates/
│ ├── layout.html
│ ├── index.html
│ ├── add_student.html
│ └── edit_student.html
├── config.py
├── populate.py
├── .gitignore
└── run.py (opcional)
config.py
class Config:
SQLALCHEMY_DATABASE_URI = 'postgresql://usuario:contraseña@localhost/estudiantes_db'
SQLALCHEMY_TRACK_MODIFICATIONS = False
Reemplaza usuario y contraseña con los de tu PostgreSQL.
__init__.py
en app/
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Config
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
app.config.from_object(Config)
db.init_app(app)
from .routes import main
app.register_blueprint(main)
return app
models.py
from . import db
class Estudiante(db.Model):
id = db.Column(db.Integer, primary_key=True)
nombre = db.Column(db.String(100), nullable=False)
edad = db.Column(db.Integer)
carrera = db.Column(db.String(100))
routes.py
from flask import Blueprint, render_template, request, redirect, url_for
from .models import Estudiante
from . import db
main = Blueprint('main', __name__)
@main.route('/')
def index():
estudiantes = Estudiante.query.all()
return render_template('index.html', estudiantes=estudiantes)
@main.route('/add', methods=['GET', 'POST'])
def add_student():
if request.method == 'POST':
nombre = request.form['nombre']
edad = request.form['edad']
carrera = request.form['carrera']
nuevo = Estudiante(nombre=nombre, edad=int(edad) if edad else None, carrera=carrera)
db.session.add(nuevo)
db.session.commit()
return redirect(url_for('main.index'))
return render_template('add_student.html')
@main.route('/edit/<int:id>', methods=['GET', 'POST'])
def edit_student(id):
estudiante = Estudiante.query.get_or_404(id)
if request.method == 'POST':
estudiante.nombre = request.form['nombre']
edad = request.form['edad']
estudiante.edad = int(edad) if edad else None
estudiante.carrera = request.form['carrera']
db.session.commit()
return redirect(url_for('main.index'))
return render_template('edit_student.html', estudiante=estudiante)
@main.route('/delete/<int:id>')
def delete_student(id):
estudiante = Estudiante.query.get_or_404(id)
db.session.delete(estudiante)
db.session.commit()
return redirect(url_for('main.index'))