Devolver una Response Directamente¶
🌐 Traducción por IA y humanos
Esta traducción fue hecha por IA guiada por humanos. 🤝
Podría tener errores al interpretar el significado original, o sonar poco natural, etc. 🤖
Puedes mejorar esta traducciónayudándonos a guiar mejor al LLM de IA.
Cuando creas unapath operation enFastAPI, normalmente puedes devolver cualquier dato desde ella: undict, unalist, un modelo de Pydantic, un modelo de base de datos, etc.
Por defecto,FastAPI convertiría automáticamente ese valor de retorno a JSON usando eljsonable_encoder explicado enJSON Compatible Encoder.
Luego, detrás de escena, pondría esos datos compatibles con JSON (por ejemplo, undict) dentro de unJSONResponse que se usaría para enviar el response al cliente.
Pero puedes devolver unJSONResponse directamente desde tuspath operations.
Esto podría ser útil, por ejemplo, para devolver headers o cookies personalizados.
Devolver unaResponse¶
De hecho, puedes devolver cualquierResponse o cualquier subclase de ella.
Consejo
JSONResponse en sí misma es una subclase deResponse.
Y cuando devuelves unaResponse,FastAPI la pasará directamente.
No hará ninguna conversión de datos con los modelos de Pydantic, no convertirá los contenidos a ningún tipo, etc.
Esto te da mucha flexibilidad. Puedes devolver cualquier tipo de datos, sobrescribir cualquier declaración o validación de datos, etc.
Usar eljsonable_encoder en unaResponse¶
ComoFastAPI no realiza cambios en unaResponse que devuelves, tienes que asegurarte de que sus contenidos estén listos para ello.
Por ejemplo, no puedes poner un modelo de Pydantic en unJSONResponse sin primero convertirlo a undict con todos los tipos de datos (comodatetime,UUID, etc.) convertidos a tipos compatibles con JSON.
Para esos casos, puedes usar eljsonable_encoder para convertir tus datos antes de pasarlos a un response:
fromdatetimeimportdatetimefromfastapiimportFastAPIfromfastapi.encodersimportjsonable_encoderfromfastapi.responsesimportJSONResponsefrompydanticimportBaseModelclassItem(BaseModel):title:strtimestamp:datetimedescription:str|None=Noneapp=FastAPI()@app.put("/items/{id}")defupdate_item(id:str,item:Item):json_compatible_item_data=jsonable_encoder(item)returnJSONResponse(content=json_compatible_item_data)Detalles técnicos
También podrías usarfrom starlette.responses import JSONResponse.
FastAPI proporciona los mismosstarlette.responses comofastapi.responses solo como una conveniencia para ti, el desarrollador. Pero la mayoría de los responses disponibles vienen directamente de Starlette.
Devolver unaResponse personalizada¶
El ejemplo anterior muestra todas las partes que necesitas, pero aún no es muy útil, ya que podrías haber devuelto elitem directamente, yFastAPI lo colocaría en unJSONResponse por ti, convirtiéndolo a undict, etc. Todo eso por defecto.
Ahora, veamos cómo podrías usar eso para devolver un response personalizado.
Digamos que quieres devolver un response enXML.
Podrías poner tu contenido XML en un string, poner eso en unResponse, y devolverlo:
fromfastapiimportFastAPI,Responseapp=FastAPI()@app.get("/legacy/")defget_legacy_data():data="""<?xml version="1.0"?> <shampoo> <Header> Apply shampoo here. </Header> <Body> You'll have to use soap here. </Body> </shampoo> """returnResponse(content=data,media_type="application/xml")Notas¶
Cuando devuelves unaResponse directamente, sus datos no son validados, convertidos (serializados), ni documentados automáticamente.
Pero aún puedes documentarlo como se describe enAdditional Responses in OpenAPI.
Puedes ver en secciones posteriores cómo usar/declarar estasResponses personalizadas mientras todavía tienes conversión automática de datos, documentación, etc.







