Puedes declarar un parámetro de tipo Response en tu función de la operación de path (como puedes hacer para cookies y headers).
Y luego puedes establecer el status_code en ese objeto de respuesta temporal.
fromfastapiimportFastAPI,Response,statusapp=FastAPI()tasks={"foo":"Listen to the Bar Fighters"}@app.put("/get-or-create-task/{task_id}",status_code=200)defget_or_create_task(task_id:str,response:Response):iftask_idnotintasks:tasks[task_id]="This didn't exist before"response.status_code=status.HTTP_201_CREATEDreturntasks[task_id]
Y luego puedes retornar cualquier objeto que necesites, como normalmente lo harías (un dict, un modelo de base de datos, etc).
Y si declaraste un response_model, aún se usará para filtrar y convertir el objeto que retornaste.
FastAPI usará esa respuesta temporal para extraer el código de estado (también cookies y headers), y los pondrá en la respuesta final que contiene el valor que retornaste, filtrado por cualquier response_model.
También puedes declarar la dependencia del parámetro Response, y establecer el código de estado en ellos. Pero ten en cuenta que el último en establecerse será el que gane.