Un post “hermano” para que completes tu preparación.
1. Escenario del ejercicio
Tu profe dejará un enunciado muy parecido a este:
«Dispones de una API Flask que gestiona usuarios en memoria.
Añade / corrige funcionalidades, documenta los endpoints y escribe pruebas unitarias.»
from flask import Flask, request, jsonify
app = Flask(__name__)
usuarios = [
{"id": 1, "nombre": "Juan", "email": "juan@example.com"},
{"id": 2, "nombre": "María", "email": "maria@example.com"}
]
# …rutas básicas (GET, POST, PUT, DELETE)
El reto no es solo “que funcione”, sino cómo lo justificas y qué tan limpio queda el código.
2. Qué pueden pedirte exactamente
💡 Task | Lo que evalúan |
---|---|
Implementar PATCH /usuarios/<id> | Manejo fino de updates parciales, control de errores |
Validar que email sea único | Pensamiento crítico + comprensión del dataset |
Mover la “DB” a g o a un módulo | Buen diseño y separación de responsabilidades |
Proteger la API con @app.before_request | Conocimiento de middlewares y autenticación |
Añadir doc automática con Swagger (Flask – RESTX) | Capacidad de integrar librerías externas |
Crear 3 tests con pytest | TDD y pruebas automatizadas |
3. Pasos para clavar el examen
- Levanta la API en local (puerto 5000).
- Haz un mapeo rápido: dibuja en un papel los cinco endpoints existentes.
- Empieza por los tests (sí, antes de tocar nada).
- Refactor por capas:
- Servicio (
services/user_service.py
) - Modelo / DTO
- Controlador (las rutas)
- Servicio (
- Ponte en modo revisor: nombra variables bien, elimina prints, añade logs con nivel.
- Documenta: en el readme o directamente en Swagger UI (5 puntos extra).
4. Plantilla de respuesta (copiar-pegar)
# services/user_service.py
def get_all():
return usuarios
def get_by_id(uid):
return next((u for u in usuarios if u["id"] == uid), None)
def create(data):
if any(u["email"] == data["email"] for u in usuarios):
raise ValueError("Email duplicado")
data["id"] = max(u["id"] for u in usuarios) + 1
usuarios.append(data)
return data
# routes.py
@bp.route("/usuarios/<int:uid>", methods=["PATCH"])
def patch_user(uid):
usuario = user_service.get_by_id(uid)
if not usuario:
return {"error": "No encontrado"}, 404
usuario.update(request.json)
return usuario, 200
# tests/test_users.py
def test_create_user(client):
res = client.post("/usuarios", json={
"nombre": "Ana", "email": "ana@example.com"
})
assert res.status_code == 201
assert res.get_json()["nombre"] == "Ana"
5. Checklist de última hora
- Los códigos HTTP son correctos (201 ≠ 200).
- Manejas el Content-Type: application/json en respuestas de error.
- Los tests pasan con
pytest -q
(0 failed). - Hay comentarios pep-257 y tipado opcional (
-> dict
). - No queda información sensible en logs.
6. Recursos rápidos
- Extensión VS Code “REST Client” – envía peticiones sin salir del editor.
- pytest-watch (
ptw
) – rerun automático de tests cada guardado. - Tutorial JWT con Flask: flask-jwt-extended.readthedocs.io
7. Cierre
Si dominas estos pasos llegarás con ventaja: sabrás programar, probar y explicar tu solución. Y recuerda: la diferencia entre un 6 y un 9 casi siempre está en los detalles de clean code y pruebas.
¡A practicar y a por la nota máxima! 🏆