Saltar al contenido

Simulación de examen 🚀 — API REST con Flask

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

💡 TaskLo que evalúan
Implementar PATCH /usuarios/<id>Manejo fino de updates parciales, control de errores
Validar que email sea únicoPensamiento crítico + comprensión del dataset
Mover la “DB” a g o a un móduloBuen diseño y separación de responsabilidades
Proteger la API con @app.before_requestConocimiento de middlewares y autenticación
Añadir doc automática con Swagger (Flask – RESTX)Capacidad de integrar librerías externas
Crear 3 tests con pytestTDD y pruebas automatizadas

3. Pasos para clavar el examen

  1. Levanta la API en local (puerto 5000).
  2. Haz un mapeo rápido: dibuja en un papel los cinco endpoints existentes.
  3. Empieza por los tests (sí, antes de tocar nada).
  4. Refactor por capas:
    • Servicio (services/user_service.py)
    • Modelo / DTO
    • Controlador (las rutas)
  5. Ponte en modo revisor: nombra variables bien, elimina prints, añade logs con nivel.
  6. 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! 🏆

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Tomas Gonzalez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

¿Atascado con tu proyecto? Presupuesto GRATIS

X
error: Content is protected !!
Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad