Puedes declarar un parámetro de tipo Response en tu función de operación de ruta (como puedes hacer para cookies).
Y luego puedes establecer headers en ese objeto de respuesta temporal.
fromfastapiimportFastAPI,Responseapp=FastAPI()@app.get("/headers-and-object/")defget_headers(response:Response):response.headers["X-Cat-Dog"]="alone in the world"return{"message":"Hello World"}
Y luego puedes devolver cualquier objeto que necesites, como lo harías normalmente (un dict, un modelo de base de datos, etc).
Y si declaraste un response_model, este se seguirá usando para filtrar y convertir el objeto que devolviste.
FastAPI usará esa respuesta temporal para extraer los headers (también cookies y código de estado), y los pondrá en la respuesta final que contiene el valor que devolviste, filtrado por cualquier response_model.
También puedes declarar el parámetro Response en dependencias, y establecer headers (y cookies) en ellas.
fromfastapiimportFastAPIfromfastapi.responsesimportJSONResponseapp=FastAPI()@app.get("/headers/")defget_headers():content={"message":"Hello World"}headers={"X-Cat-Dog":"alone in the world","Content-Language":"en-US"}returnJSONResponse(content=content,headers=headers)
Detalles Técnicos
También podrías usar from starlette.responses import Response o from starlette.responses import JSONResponse.
FastAPI proporciona las mismas starlette.responses que fastapi.responses solo como una conveniencia para ti, el desarrollador. Pero la mayoría de las respuestas disponibles vienen directamente de Starlette.
Y como el Response se puede usar frecuentemente para establecer headers y cookies, FastAPI también lo proporciona en fastapi.Response.