Quiero crear un punto final FastAPI que solo acepte un cuerpo de solicitud de publicación arbitrario y lo devuelva.
Si envío {"foo" : "bar"} , quiero recuperar {"foo" : "bar"} . Pero también quiero poder enviar {"foo1" : "bar1", "foo2" : "bar2"} y recuperarlo.
Lo intenté:
from fastapi import FastAPI app = FastAPI() app.post("/") async def handle(request: BaseModel): return requestPero eso devuelve un diccionario vacío, no importa lo que le envíe.
¿Algunas ideas?
Puede usar la sugerencia de tipo Dict[Any, Any] para decirle a FastAPI que espera cualquier JSON válido:
from typing import Any, Dict from fastapi import FastAPI app = FastAPI() @app.post("/") async def handle(request: Dict[Any, Any]): return requestLa respuesta aceptada funciona siempre que la entrada esté envuelta en un diccionario. Es decir: comenzó con un { y termina con un } . Sin embargo, eso no cubre todas las entradas JSON válidas. Por ejemplo, las siguientes entradas JSON válidas fallarían:
true / false1.2null"text"[1,2,3]Para que el punto final acepte una entrada JSON verdaderamente genérica, lo siguiente funcionaría:
from typing import Any, Dict, List, Union from fastapi import FastAPI app = FastAPI() @app.post("/") async def handle(request: Union[List,Dict,Any]=None): return request El solo uso de Any no funcionó por alguna razón. Cuando lo usé, FastApi esperaba la entrada de los argumentos de la consulta, no del cuerpo de la solicitud.
=None hace que acepte null y también un cuerpo vacío. Puede dejar esa parte desactivada y luego se requerirá que el cuerpo de la solicitud no esté vacío/nulo.
Si está utilizando Python3.10, puede deshacerse de la Union y escribir la definición como:
async def handle(request: List | Dict | Any = None):