← Volver a tutoriales

Crea un MVP de API de inventario con FastAPI en 1 hora

Aprende a construir una API REST para gestionar stock de productos usando FastAPI, ideal para emprendimientos que necesitan controlar inventario sin dependencias complejas.

Si estás construyendo un emprendimiento de retail, e-commerce o logística, necesitas una forma simple de gestionar el inventario de tus productos. FastAPI te permite crear una API robusta y documentada automáticamente en muy poco tiempo.

¿Qué vamos a construir?

Una API REST con FastAPI que permita:

  • Listar todos los productos del inventario
  • Obtener el detalle de un producto por ID
  • Registrar nuevos productos
  • Actualizar el stock de un producto existente

Prerrequisitos

  1. Instalar Python 3.8 o superior
  2. Instalar FastAPI y un ASGI server (Uvicorn):
pip install fastapi uvicorn

Paso 1: Crear el proyecto

Crea una carpeta para tu proyecto y un archivo main.py:

mkdir inventory-api
cd inventory-api
touch main.py

Paso 2: Definir los modelos de datos

Usaremos pydantic (incluido en FastAPI) para validar los datos de entrada y salida. En main.py, escribe:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional, List
from datetime import datetime

class ProductBase(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    stock: int

class ProductCreate(ProductBase):
    pass

class Product(ProductBase):
    id: int
    created_at: datetime

    class Config:
        orm_mode = True

Paso 3: Configurar la base de datos en memoria

Para este MVP usaremos una lista en Python como «base de datos» temporal:

# Simulación de base de datos
fake_db: List[Product] = []
next_id = 1

Paso 4: Crear endpoints

Agrega las rutas de la API:

app = FastAPI(title="API de Inventario")

@app.post("/products/", response_model=Product)
def create_product(product: ProductCreate):
    global next_id
    new_product = Product(
        id=next_id,
        name=product.name,
        description=product.description,
        price=product.price,
        stock=product.stock,
        created_at=datetime.now()
    )
    fake_db.append(new_product)
    next_id += 1
    return new_product

@app.get("/products/", response_model=List[Product])
def read_products():
    return fake_db

@app.get("/products/{product_id}", response_model=Product)
def read_product(product_id: int):
    for product in fake_db:
        if product.id == product_id:
            return product
    raise HTTPException(status_code=404, detail="Producto no encontrado")

@app.put("/products/{product_id}", response_model=Product)
def update_product(product_id: int, product: ProductCreate):
    for index, existing in enumerate(fake_db):
        if existing.id == product_id:
            updated = Product(
                id=product_id,
                name=product.name,
                description=product.description,
                price=product.price,
                stock=product.stock,
                created_at=existing.created_at
            )
            fake_db[index] = updated
            return updated
    raise HTTPException(status_code=404, detail="Producto no encontrado")

Paso 5: Ejecutar la API

Guarda el archivo y ejecuta el server:

uvicorn main:app --reload

Abre tu navegador en http://localhost:8000/docs. Verás la documentación automática de Swagger UI.

Ejemplo de uso

Usa curl para probar la creación de un producto:

curl -X POST "http://localhost:8000/products/" 
-H "Content-Type: application/json" 
-d '{"name":"Laptop","description":"Laptop de 15 pulgadas","price":899.99,"stock":10}'

Deberías recibir una respuesta JSON con los datos del producto incluyendo su ID y fecha de creación.

Errores frecuentes

  • ImportError: No module named ‘fastapi’: Asegúrate de haber ejecutado pip install fastapi en el entorno correcto.
  • 422 Unprocessable Entity: Los datos enviados no cumplen con el esquema (por ejemplo, missing field o tipo incorrecto). Revisa el cuerpo de la respuesta para ver qué campo falló.
  • 404 Not Found: El ID del producto no existe. Verifica que el ID sea correcto.

Advertencia práctica

Esta API usa una lista en memoria. Cuando el server se reinicia, se pierden todos los datos. Para uso real, conecta una base de datos real como SQLite (con SQLAlchemy) o PostgreSQL.

Siguiente paso

Conecta esta API a una base de datos real usando SQLAlchemy y sqlite, o implementa autenticación con JWT para limitar el acceso.

Para profundizar, visita la documentación oficial de FastAPI: fastapi.tiangolo.com

Fuentes para profundizar