Module 1: Setup and First API
¿Qué es FastAPI?
Descripción de la cápsula
FastAPI es un framework moderno para construir APIs REST en Python. Creado por Sebastián Ramírez (tiangolo), combina alto rendimiento, tipado estático, validación automática y documentación integrada. Si vienes de Flask o Django, descubrirás que FastAPI adopta un enfoque diferente: menos configuración manual, más convenciones inteligentes derivadas de los type hints de Python.
Esta cápsula responde las preguntas clave antes de tocar una línea de código: qué es FastAPI, por qué elegirlo frente a alternativas, qué características lo destacan, quién lo usa en producción, y cómo encaja en el ecosistema Python para APIs.
Definición: ¿Qué es FastAPI?
FastAPI es un framework web moderno y de alto rendimiento para construir APIs con Python 3.8+. Está construido sobre estándares abiertos: OpenAPI para documentación y ASGI para el protocolo de servidor.
En una frase: FastAPI es el framework que hace que escribir APIs REST en Python sea rápido, seguro y con documentación automática.
Origen del nombre
"Fast" hace referencia a dos cosas: (1) alto rendimiento en ejecución, y (2) velocidad de desarrollo. "API" indica su enfoque principal. No es un framework para servir páginas HTML complejas con templates — está diseñado para exponer endpoints que retornan datos (típicamente JSON).
Características principales
| Característica | Qué significa |
|---|---|
| Alto rendimiento | Uno de los frameworks Python más rápidos (comparable a Node.js y Go) |
| Desarrollo rápido | Menos boilerplate, más productividad |
| Type hints nativos | Los type hints de Python activan validación y documentación |
| Documentación automática | Swagger UI y ReDoc generados sin código extra |
| ASGI nativo | Soporte para async/await, WebSockets, HTTP/2 |
FastAPI vs Flask vs Django
Si conoces Flask o Django, esta comparación te sitúa:
| Aspecto | FastAPI | Flask | Django |
|---|---|---|---|
| Enfoque principal | APIs REST | Web apps + APIs | Full-stack web |
| Curva de aprendizaje | Media (requiere type hints) | Baja | Alta |
| Rendimiento | Muy alto | Bueno | Bueno |
| Documentación API | Automática (OpenAPI) | Manual o con extensión | Manual o con DRF |
| Validación de datos | Integrada (Pydantic) | Manual o librerías | Serializers en DRF |
| Async nativo | Sí | Parcial (2.0+) | Parcial (3.1+) |
| WebSockets | Sí | Sí (con extensiones) | Sí (con Channels) |
| Ecosistema | Creciente | Maduro | Maduro |
| Ideal para | APIs modernas, microservicios | Prototipos rápidos | Apps completas con admin |
¿Cuándo elegir FastAPI?
- ✅ Construyes APIs REST o GraphQL como producto principal
- ✅ Quieres documentación automática que refleje tu código
- ✅ Usas o quieres usar type hints en Python
- ✅ Necesitas alto rendimiento (muchos requests concurrentes)
- ✅ Tu stack incluye async/await (bases de datos async, HTTP cliente async)
¿Cuándo considerar Flask o Django?
- Flask: prototipos muy rápidos, apps pequeñas, más control manual
- Django: aplicaciones completas con panel de administración, ORM complejo, auth incluido
Tabla de decisión rápida
| Tu situación | Recomendación |
|---|---|
| API REST o microservicio | FastAPI |
| Prototipo en 1 hora | Flask (o FastAPI si ya dominas types) |
| App con admin, auth, ORM completo | Django |
| Equipo sin experiencia en type hints | Flask o invertir en aprender types con FastAPI |
| Alto tráfico, muchos requests concurrentes | FastAPI |
| Integración con frontend que consume OpenAPI | FastAPI (docs automáticas) |
Características clave en detalle
1. Async y type hints
FastAPI está diseñado desde cero para aprovechar las capacidades modernas de Python:
# Ejemplo mínimo — los type hints activan validación y docs
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def get_item(item_id: int): # ← El type hint int valida automáticamente
return {"item_id": item_id}
Si alguien llama /items/abc, FastAPI retorna un error 422 con un mensaje claro — sin escribir validación manual.
2. Validación automática con Pydantic
FastAPI usa Pydantic para validar requests y serializar responses. Pydantic está integrado en el core del framework:
- Request body: Define un modelo Pydantic y FastAPI valida el JSON entrante
- Path/query params: Los type hints (
int,str,Optional[int]) activan validación - Response: Puedes declarar modelos de respuesta para documentación precisa
En el Módulo 4 trabajarás con Pydantic en profundidad. Por ahora basta saber que los type hints simples (int, str) ya activan validación básica sin modelos.
3. Documentación automática (OpenAPI)
Cada endpoint que defines aparece automáticamente en:
/docs— Swagger UI interactivo (puedes probar endpoints desde el navegador)/redoc— ReDoc (documentación de referencia)/openapi.json— Schema OpenAPI en JSON
No escribes documentación separada. El código es la documentación.
4. Estándares abiertos
FastAPI se basa en:
- OpenAPI 3.1 — Estándar de industria para describir APIs
- JSON Schema — Para validación de datos
- ASGI — Protocolo asíncrono para aplicaciones web en Python
Ecosistema: uvicorn, Pydantic, Starlette
FastAPI no trabaja solo. Su stack típico:
| Componente | Rol |
|---|---|
| FastAPI | Framework que define endpoints, validación y documentación |
| uvicorn | Servidor ASGI que recibe requests HTTP y los pasa a FastAPI |
| Pydantic | Validación de datos, models, serialización (incluido en FastAPI) |
| Starlette | Framework web bajo nivel sobre el que FastAPI se construye |
Request HTTP → uvicorn → Starlette → FastAPI → tu código
- uvicorn: Lo instalarás explícitamente (
pip install uvicorn[standard]) - Pydantic: Viene con FastAPI
- Starlette: Dependencia interna de FastAPI, no lo configuras directamente
¿Quién usa FastAPI?
FastAPI es usado en producción por empresas y proyectos de todo tamaño. Algunos ejemplos públicos:
- Microsoft — Documentación oficial menciona uso interno
- Uber — APIs internas
- Netflix — Herramientas internas
- Explosion (creadores de spaCy) — APIs de NLP
- Proyectos open source — Muchos repos en GitHub adoptan FastAPI para APIs
Su adopción ha crecido rápidamente desde su lanzamiento en 2018, especialmente en el espacio de machine learning y APIs de alto rendimiento.
Por qué las empresas lo adoptan
Las razones típicas que citan equipos que migraron a FastAPI:
- Menos tiempo en documentación: La documentación automática se mantiene sincronizada con el código. No hay que actualizar Postman collections o Confluence manualmente.
- Validación desde el contrato: Los type hints definen el contrato de la API. Si cambias un tipo, los tests y la documentación reflejan el cambio automáticamente.
- Rendimiento sin sacrificar DX: No tienes que elegir entre velocidad de desarrollo y velocidad de ejecución. FastAPI ofrece ambos.
- Estandarización: OpenAPI permite generar clientes en otros lenguajes (TypeScript, Go) desde el schema. Útil en equipos multi-stack.
Práctica: Comparar con un ejemplo mínimo
Para sentir la diferencia, aquí está el mismo endpoint en los tres frameworks:
Flask
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/items/<int:item_id>")
def get_item(item_id):
return jsonify({"item_id": item_id})
Django (con Django REST Framework)
# views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view(['GET'])
def get_item(request, item_id):
return Response({"item_id": item_id})
FastAPI
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def get_item(item_id: int):
return {"item_id": item_id}
Diferencias notables:
- FastAPI no requiere
jsonifyniResponse— retornar un dict es suficiente - El type hint
inten FastAPI garantiza validación; en Flask elint:en la ruta convierte pero no documenta - FastAPI genera documentación automática; Flask y DRF requieren configuración adicional
Cantidad de código
Flask: 7 líneas (sin contar imports). Django/DRF: más líneas por el boilerplate de views y URLs. FastAPI: 5 líneas en el endpoint, y además obtienes validación y documentación sin código extra.
Qué hace FastAPI por ti automáticamente
Cuando defines def get_item(item_id: int):
- Validación: Si llega "abc", retorna 422 con mensaje claro
- Conversión: "42" se convierte a
intantes de llegar a la función - Documentación: En
/docsaparece queitem_ides integer, obligatorio - Serialización: El
returnse convierte a JSON con Content-Type correcto
Todo eso sin una línea de código adicional.
Ejemplo: Validación automática en acción
Supón que defines:
@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id}
Llamadas válidas e inválidas:
| Request | Resultado |
|---|---|
GET /users/42 | 200 OK, {"user_id": 42} |
GET /users/abc | 422, JSON con detalle del error de validación |
GET /users/-1 | 200 OK (FastAPI acepta -1 como int; validaciones adicionales las defines tú) |
GET /users/3.14 | 422 (float no es int) |
La validación de tipo evita que datos incorrectos lleguen a tu lógica. El mensaje de error 422 incluye qué parámetro falló y por qué.
Integración con el ecosistema Python
FastAPI se integra bien con herramientas que ya conoces:
| Herramienta | Integración |
|---|---|
| pytest | TestClient incluido para tests de endpoints |
| mypy | Type hints permiten type checking estático |
| SQLAlchemy | Integración directa con modelos ORM |
| Alembic | Migraciones de base de datos |
| Docker | Imágenes oficiales y documentación |
En el path Backend Python Developer usarás varias de estas en combinación con FastAPI.
Cuándo NO usar FastAPI
FastAPI no es la herramienta para todo. Considera alternativas cuando:
- Necesitas un panel de administración listo (Django Admin)
- Tu equipo no usa type hints y no quiere adoptarlos
- El proyecto es un monolito tradicional con muchas páginas HTML servidas por el backend
- Requieres un ecosistema de plugins muy maduro (Django tiene más añños)
Para APIs puras, microservicios y aplicaciones modernas, FastAPI suele ser la mejor opción en Python.
Troubleshooting conceptual
"¿FastAPI reemplaza a Django?"
No. Son herramientas para problemas distintos. Django es un framework full-stack (HTML, ORM, admin, auth). FastAPI es para APIs. Puedes tener un backend Django que expone una API con DRF, o un microservicio puro con FastAPI.
"¿Necesito saber async para empezar?"
No. Puedes escribir endpoints síncronos (def) desde el inicio. FastAPI los ejecuta en un thread pool. Cuando integres bases de datos async, aprenderás async def.
"¿FastAPI es solo para APIs o también para servir HTML?"
FastAPI puede servir HTML y archivos estáticos, pero está optimizado para APIs (JSON). Para aplicaciones web con muchas páginas HTML, Django o Flask suelen ser más cómodos.
"¿Qué versión de Python necesito?"
Python 3.8+. Se recomienda 3.9 o superior para mejor soporte de type hints.
Historia y filosofía
FastAPI fue lanzado en 2018 por Sebastián Ramírez. Su filosofía se resume en tres pilares:
- Performance: Basado en Starlette (uno de los frameworks Python más rápidos) y Pydantic (validación en Rust)
- Developer experience: Documentación automática, validación con type hints, menos código repetitivo
- Standards-based: OpenAPI, JSON Schema, OAuth2 — herramientas estándar que integran con el ecosistema
A diferencia de frameworks que priorizan flexibilidad máxima (Flask) o convención sobre configuración (Django), FastAPI prioriza menos código manual, más inferencia inteligente a partir de lo que ya escribes.
Benchmarks: ¿Qué tan rápido es?
Benchmarks públicos (como TechEmpower) sitúan a FastAPI entre los frameworks Python más rápidos, a menudo superando a Flask y Django por amplio margen. La razón: ASGI maneja múltiples requests concurrentes en un solo proceso, y el código está optimizado para I/O asíncrono.
Para APIs que hacen muchas llamadas a bases de datos o servicios externos, la diferencia puede ser significativa. Para APIs que retornan datos en memoria, cualquier framework moderno suele ser suficiente.
Preguntas frecuentes de principiantes
"¿Necesito saber JavaScript o frontend?"
No. FastAPI es para backends. Tu API retorna JSON. Otros (React, Vue, móvil) consumen ese JSON. Puedes desarrollar y probar la API sin tocar frontend.
"¿Puedo usar FastAPI con base de datos?"
Sí. En guías posteriores integrarás PostgreSQL con SQLAlchemy. FastAPI no incluye ORM; se combina con herramientas existentes.
"¿Es difícil migrar de Flask a FastAPI?"
Depende del tamaño. APIs pequeñas: unas horas. Proyectos grandes: días o semanas. Los conceptos son similares (rutas, request/response); la sintaxis cambia.
"¿FastAPI tiene auth incluido?"
Incluye soporte para OAuth2 y JWT en el paquete fastapi.security. La implementación (base de datos de usuarios, etc.) la haces tú o usas librerías. Se cubre en la guía de Authentication.
"¿Qué pasa con las websockets?"
FastAPI soporta WebSockets nativamente. Se cubre en módulos avanzados. Para empezar, los endpoints HTTP GET/POST son suficientes.
Ejercicios
Ejercicio 1: Tabla comparativa (Fácil)
Crea una tabla comparando FastAPI, Flask y Django en 4 aspectos que te importen para elegir un framework para un proyecto de API REST. Usa tus propias palabras.
Ver solución
Ejemplo de tabla:
| Aspecto | FastAPI | Flask | Django |
|---|---|---|---|
| Documentación API | Automática | Manual | Con DRF |
| Curva inicial | Media | Baja | Alta |
| Rendimiento | Muy alto | Bueno | Bueno |
| Type hints | Core | Opcional | Opcional |
Explicación: La comparación ayuda a tomar decisiones informadas. Tus criterios pueden variar según el proyecto (velocidad, equipo, integraciones existentes).
Ejercicio 2: ¿FastAPI o Flask? (Medio)
Tienes que elegir framework para: (a) un API de microservicio que procesa imágenes con ML, (b) un prototipo rápido de CRUD en 2 horas. ¿Qué elegirías en cada caso y por qué?
Ver solución
(a) API de ML con imágenes: FastAPI. Alto rendimiento, soporte async para I/O intensivo, validación integrada para payloads complejos, documentación automática útil para equipos de ML.
(b) Prototipo CRUD en 2 horas: Ambos sirven. Flask tiene curva más baja si no conoces type hints. FastAPI si ya usas type hints y valoras la documentación automática desde el inicio.
Explicación: No hay respuesta única. El contexto (equipo, requisitos, plazos) determina la mejor opción.
Ejercicio 3: Ecosistema (Fácil)
¿Cuál de estos componentes instalas explícitamente con pip para un proyecto FastAPI básico: FastAPI, uvicorn, Pydantic, Starlette? ¿Cuáles vienen incluidos?
Ver solución
Instalas explícitamente: FastAPI y uvicorn
pip install fastapi "uvicorn[standard]"
Incluidos automáticamente: Pydantic y Starlette vienen como dependencias de FastAPI. No necesitas instalarlos por separado.
Explicación: pip resuelve las dependencias transitivas. Solo declaras lo que usas directamente.
Ejercicio 4: Type hints y validación (Medio)
En el ejemplo @app.get("/items/{item_id}") con def get_item(item_id: int), ¿qué pasa si un cliente llama a /items/abc? ¿Y a /items/42? Explica el comportamiento de FastAPI en cada caso.
Ver solución
-
/items/abc: FastAPI intenta convertir "abc" a int, falla, y retorna 422 Unprocessable Entity con un JSON detallando el error de validación. No se ejecuta la función. -
/items/42: "42" se convierte a int correctamente. La función se ejecuta conitem_id=42y retorna{"item_id": 42}.
Explicación: Los type hints activan validación automática. No necesitas escribir if not isinstance(item_id, int). FastAPI lo hace por ti.
Ejercicio 5: Estándares (Fácil)
FastAPI usa OpenAPI y ASGI. Busca qué significa cada uno en una frase. ¿Por qué importa usar estándares en vez de formatos propietarios?
Ver solución
OpenAPI: Estándar para describir APIs REST (endpoints, parámetros, respuestas). Permite que herramientas como Swagger UI, Postman o generadores de clientes entiendan tu API sin configuración manual.
ASGI: Protocolo asíncrono para aplicaciones web en Python. Permite que servidores como uvicorn se conecten a cualquier framework compatible (FastAPI, Starlette, Django Channels).
Por qué estándares: Interoperabilidad. Tu API puede integrarse con herramientas de terceros. Otros desarrolladores entienden el formato sin documentación extra.
Explicación: Los estándares reducen el vendor lock-in y facilitan la integración con el ecosistema.
Ejercicio 5b: Simular validación (Medio)
Sin ejecutar código, predice: si tienes @app.get("/items/{id}") con def get_item(id: int), y un cliente envía GET /items/xyz, ¿qué status code retornará FastAPI? ¿Se ejecutará la función? ¿Qué verá el cliente en el body de la respuesta?
Ver solución
- Status code: 422 Unprocessable Entity
- ¿Se ejecuta la función? No. FastAPI valida antes de llamar al endpoint.
- Body de la respuesta: Un JSON con estructura similar a:
{ "detail": [ { "type": "int_parsing", "loc": ["path", "id"], "msg": "Input should be a valid integer, unable to parse string as an integer", "input": "xyz" } ] }
Explicación: La validación ocurre en la capa de FastAPI antes de invocar tu función. El cliente recibe un mensaje descriptivo que puede usar para corregir el request.
Ejercicio 6: Argumentar la elección (Medio)
Escribir un párrafo (5-7 oraciones) justificando por qué FastAPI es una buena elección para el path Backend Python Developer. Incluir al menos 3 razones concretas.
Ver solución
FastAPI es una buena elección para el path Backend Python Developer por varias razones. Primero, la documentación automática (/docs y /redoc) elimina la fricción de mantener documentación separada y permite probar endpoints desde el navegador. Segundo, la validación integrada con type hints reduce bugs y acelera el desarrollo al no escribir validación manual. Tercero, el alto rendimiento y soporte async preparan para aplicaciones reales con bases de datos y servicios externos. Además, usa estándares (OpenAPI, ASGI) que facilitan integración con frontends y herramientas DevOps. Por último, la curva de aprendizaje es razonable si ya conoces Python y REST.
Explicación: Articular las razones ayuda a consolidar el aprendizaje y a comunicar decisiones técnicas a equipos.
Resumen de la cápsula: Lo esencial
Antes de pasar a la instalación, asegúrate de tener claro:
- Qué es FastAPI: Framework para APIs REST en Python, alto rendimiento, docs automáticas.
- Por qué frente a Flask/Django: Mejor para APIs puras; Flask para prototipos; Django para apps completas con admin.
- Ecosistema: FastAPI + uvicorn + Pydantic + Starlette. Instalas FastAPI y uvicorn; el resto viene incluido.
- Type hints: No son opcionales en FastAPI — activan validación y documentación. Si ya usas Python con tipos, te sentirás en casa.
- Estándares: OpenAPI y ASGI permiten integrar con herramientas de terceros y generar clientes en otros lenguajes.
La siguiente cápsula es práctica: crearás el proyecto, instalarás dependencias y escribirás tu primer main.py.
Resumen visual: Stack completo
Cliente (navegador, Postman, curl)
↓ HTTP
uvicorn (ASGI server) — escucha en puerto 8000
↓ pasa el request
FastAPI (framework)
↓ routing + validación
Tu endpoint (función Python)
↓ return dict/list
FastAPI (serialización a JSON)
↓
uvicorn → HTTP response al cliente
Mientras desarrollas, usarás /docs para probar. En producción, uvicorn (o Gunicorn+uvicorn) sirve la app. FastAPI es la capa que conecta HTTP con tu lógica de negocio.
Resumen
- ✅ FastAPI es un framework moderno para APIs REST en Python, con alto rendimiento y documentación automática
- ✅ Destaca frente a Flask/Django en: validación integrada, docs automáticas, async nativo
- ✅ Usa type hints, Pydantic, uvicorn y Starlette en su ecosistema
- ✅ Es ideal para APIs modernas, microservicios y proyectos que priorizan velocidad de desarrollo y rendimiento
- ✅ Empresas como Microsoft, Uber y Netflix lo usan en producción
Próxima cápsula: Instalación y Estructura — configurarás tu entorno y crearás la estructura base del proyecto.
Mapa mental: FastAPI en una página
FastAPI
├── Qué es: Framework para APIs REST en Python
├── Por qué: Alto rendimiento, docs automáticas, validación con type hints
├── Cuándo: APIs puras, microservicios, alto tráfico
├── Cuándo no: Apps con admin listo (Django), equipos sin type hints
├── Ecosistema: uvicorn (servidor) + Pydantic (validación) + Starlette (base)
├── Estándares: OpenAPI (docs) + ASGI (protocolo)
└── Quién lo usa: Microsoft, Uber, Netflix, startups, proyectos open source
Usa este mapa como referencia cuando tengas que explicar o recordar por qué elegiste FastAPI.
Transición a la siguiente cápsula
En la Cápsula 03 (Instalación y Estructura) pondrás en práctica todo lo conceptual de esta cápsula:
- Crearás un virtual environment
- Instalarás
fastapiyuvicorn[standard] - Generarás
requirements.txt - Crearás la estructura
app/main.py - Escribirás el primer endpoint que retorna
{"message": "FastAPI is running"}
La teoría de esta cápsula te da contexto. La práctica de la siguiente te da un proyecto funcional. No necesitas memorizar tablas comparativas — con el uso te quedarán claras las diferencias entre FastAPI y otras opciones.
Resumen ejecutivo (30 segundos)
- FastAPI = framework Python para APIs REST, alto rendimiento, docs automáticas.
- Ventaja principal: validación + documentación desde type hints, sin código extra.
- Stack: FastAPI + uvicorn + Pydantic (incluido).
- Elegir FastAPI cuando: API es el producto, quieres docs automáticas, alto tráfico.
- Elegir Flask/Django cuando: prototipo mínimo, app completa con admin.
Próximo paso
Pasa a la Cápsula 03 para instalar FastAPI, configurar el proyecto y ejecutar tu primer endpoint. Todo lo conceptual de esta cápsula cobrará sentido cuando veas el código en acción.
Tres ideas para llevarte
- Menos código, más inferencia: FastAPI usa lo que escribes (type hints, nombres) para generar documentación y validación. No duplicas esfuerzo.
- Estándares > custom: OpenAPI y ASGI significan que tu API habla un idioma que el ecosistema entiende.
- Developer experience: La combinación de velocidad de desarrollo + velocidad de ejecución hace que FastAPI sea una inversión que paga rápido.
Si vienes de otro framework
- Flask: Los decoradores te resultarán familiares. La diferencia: no usas
jsonify; retornas dicts directamente. Los type hints son la novedad principal. - Django/DRF: FastAPI es más ligero. No hay models, migrations ni admin. Es solo la capa HTTP. La base de datos la integras con SQLAlchemy u otra herramienta.
- Node/Express: La filosofía es similar: menos boilerplate, convenciones inteligentes. FastAPI es a Python lo que Express+TypeScript puede ser a Node, pero con documentación automática incluida.
Requisitos previos (recapitulando)
Para seguir esta guía necesitas: Python 3.8+ (recomendado 3.9+), conocimientos básicos de HTTP y REST (de la REST APIs Guide), y familiaridad con Python (funciones, imports, diccionarios). No necesitas experiencia previa con FastAPI, Flask o Django. Si nunca has usado type hints, los aprenderás sobre la marcha — son más simples de lo que parecen.
Recursos Adicionales
- FastAPI Official Site - Sitio y documentación oficial
- FastAPI vs Flask - Blog Post - Comparación oficial con alternativas
- Pydantic Documentation - Validación y serialización de datos
- Starlette Documentation - Framework base de FastAPI
- ASGI Specification - Protocolo que usa FastAPI
- OpenAPI Specification - Estándar de documentación de APIs
Módulo 1, Cápsula 02 — FastAPI Fundamentals Guide