JSON solo puede contener strings codificados en UTF-8, así que no puede contener bytes crudos.
Base64 puede codificar datos binarios en strings, pero para hacerlo, necesita usar más caracteres que los datos binarios originales, así que normalmente sería menos eficiente que archivos regulares.
Usa base64 solo si definitivamente necesitas incluir datos binarios en JSON, y no puedes usar archivos para eso.
Puedes declarar un modelo de Pydantic con campos bytes, y luego usar val_json_bytes en la configuración del modelo para indicarle que use base64 para validar los datos JSON de entrada, como parte de esa validación decodificará el string base64 a bytes.
fromfastapiimportFastAPIfrompydanticimportBaseModelclassDataInput(BaseModel):description:strdata:bytesmodel_config={"val_json_bytes":"base64"}# Code here omitted 👈app=FastAPI()@app.post("/data")defpost_data(body:DataInput):content=body.data.decode("utf-8")return{"description":body.description,"content":content}# Code below omitted 👇
También puedes usar campos bytes con ser_json_bytes en la configuración del modelo para datos de salida, y Pydantic serializará los bytes como base64 al generar la respuesta JSON.
fromfastapiimportFastAPIfrompydanticimportBaseModel# Code here omitted 👈classDataOutput(BaseModel):description:strdata:bytesmodel_config={"ser_json_bytes":"base64"}# Code here omitted 👈app=FastAPI()# Code here omitted 👈@app.get("/data")defget_data()->DataOutput:data="hello".encode("utf-8")returnDataOutput(description="A plumbus",data=data)# Code below omitted 👇
Y por supuesto, puedes usar el mismo modelo configurado para usar base64 para manejar tanto la entrada (validar) con val_json_bytes como la salida (serializar) con ser_json_bytes al recibir y enviar datos JSON.
fromfastapiimportFastAPIfrompydanticimportBaseModel# Code here omitted 👈classDataInputOutput(BaseModel):description:strdata:bytesmodel_config={"val_json_bytes":"base64","ser_json_bytes":"base64",}# Code here omitted 👈app=FastAPI()# Code here omitted 👈@app.post("/data-in-out")defpost_data_in_out(body:DataInputOutput)->DataInputOutput:returnbody