PUT es un método HTTP que se utiliza para reemplazar o actualizar un recurso completo. Normalmente se usa junto con un ID que identifica al recurso.
La diferencia con POST:
Nota: También existe PATCH, que se usa para actualizaciones parciales. Lo veremos más adelante.
Vamos a trabajar con un ejemplo de productos. Tenemos un modelo Producto
y una lista en memoria que simula nuestra base de datos:
from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel, Field
from typing import List, Optional
app = FastAPI(title="API de Productos con PUT")
# --------- Modelo ----------
class Producto(BaseModel):
codigo: int = Field(gt=0, description="Identificador único")
descripcion: str = Field(min_length=3, max_length=100)
precio: float = Field(gt=0, description="Precio mayor que 0")
# Modelo para actualización (permite campos opcionales)
class ProductoUpdate(BaseModel):
descripcion: Optional[str] = Field(None, min_length=3, max_length=100)
precio: Optional[float] = Field(None, gt=0)
# --------- Base simulada ----------
productos_db: List[Producto] = [
Producto(codigo=1, descripcion="Teclado", precio=50.0),
Producto(codigo=2, descripcion="Mouse", precio=30.0),
]
@app.put("/productos/{codigo}", response_model=Producto)
def actualizar_producto(codigo: int, datos: ProductoUpdate):
# Buscar producto por código
for producto in productos_db:
if producto.codigo == codigo:
# Actualizar solo los campos enviados
if datos.descripcion is not None:
producto.descripcion = datos.descripcion
if datos.precio is not None:
producto.precio = datos.precio
return producto
# Si no se encontró
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Producto no encontrado"
)
@app.put("/productos/{codigo}")
: el parámetro codigo
se recibe en la URL.datos: ProductoUpdate
: recibe en el cuerpo un objeto JSON con los campos a modificar.Dentro de la función:
productos_db
.None
.404
./docs
)PUT /productos/1
Body:
{
"descripcion": "Teclado mecánico retroiluminado"
}
# Respuesta:
{
"codigo": 1,
"descripcion": "Teclado mecánico retroiluminado",
"precio": 50.0
}
PUT /productos/2
Body:
{
"precio": 35.0
}
# Respuesta:
{
"codigo": 2,
"descripcion": "Mouse",
"precio": 35.0
}
PUT /productos/99
Body:
{
"descripcion": "Monitor"
}
# Respuesta:
{"detail": "Producto no encontrado"}
Producto
para crear y ProductoUpdate
para actualizar (con campos opcionales).200 OK
(actualización exitosa), 404 Not Found
(recurso no existe).