Cuando creas una operación de path normalmente puedes devolver cualquier dato: un dict, una list, un modelo Pydantic, un modelo de base de datos, etc.
Por defecto, FastAPI convertiría automáticamente ese valor devuelto a JSON usando el jsonable_encoder explicado en Codificador Compatible JSON.
Luego, tras bastidores, pondría esos datos compatibles con JSON (por ejemplo, un dict) dentro de una JSONResponse que se usaría para enviar la respuesta al cliente.
Pero puedes devolver una JSONResponse directamente de tu operación de path.
Esto puede ser útil, por ejemplo, para devolver cookies o headers personalizados.
Como FastAPI no realiza ningún cambio en la Response que devuelves, debes asegurarte de que el contenido está listo.
Por ejemplo, no puedes poner un modelo Pydantic en una JSONResponse sin primero convertirlo a un dict con todos los tipos de datos (como datetime, UUID, etc) convertidos a tipos compatibles con JSON.
Para esos casos, puedes usar el jsonable_encoder para convertir tus datos antes de pasarlos a la respuesta:
También puedes usar from starlette.responses import JSONResponse.
FastAPI provee starlette.responses como fastapi.responses, simplemente como una conveniencia para ti, el desarrollador. Pero la mayoría de las respuestas disponibles vienen directamente de Starlette.
El ejemplo anterior muestra las partes que necesitas, pero no es muy útil todavía, dado que podrías simplemente devolver el item directamente, y FastAPI lo pondría en una JSONResponse por ti, convirtiéndolo en un dict, etc. Todo esto por defecto.
Ahora, veamos cómo puedes usarlo para devolver una respuesta personalizada.