Para excluir una operación de ruta del esquema OpenAPI generado (y por lo tanto, de los sistemas de documentación automática), usa el parámetro include_in_schema y configúralo como False:
Puedes limitar las líneas usadas del docstring de una función de operación de ruta para OpenAPI.
Añadir un \f (un carácter escapado de "form feed") hace que FastAPI trunque la salida usada para OpenAPI en este punto.
No aparecerá en la documentación, pero otras herramientas (como Sphinx) podrán usar el resto.
fromfastapiimportFastAPIfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:strdescription:str|None=Noneprice:floattax:float|None=Nonetags:set[str]=set()@app.post("/items/",summary="Create an item")asyncdefcreate_item(item:Item)->Item:""" Create an item with all the information: - **name**: each item must have a name - **description**: a long description - **price**: required - **tax**: if the item doesn't have tax, you can omit this - **tags**: a set of unique tag strings for this item \f :param item: User input. """returnitem
Cuando declaras una operación de ruta en tu aplicación, FastAPI genera automáticamente los metadatos relevantes sobre esa operación de ruta para incluirlos en el esquema de OpenAPI.
Esquema personalizado de operación de ruta en OpenAPI¶
El diccionario en openapi_extra se combinará profundamente con el esquema de OpenAPI generado automáticamente para la operación de ruta.
Así que, podrías añadir datos adicionales al esquema generado automáticamente.
Por ejemplo, podrías decidir leer y validar la petición con tu propio código, sin usar las características automáticas de FastAPI con Pydantic, pero aún así podrías querer definir la petición en el esquema de OpenAPI.
Podrías hacer eso con openapi_extra:
fromfastapiimportFastAPI,Requestapp=FastAPI()defmagic_data_reader(raw_body:bytes):return{"size":len(raw_body),"content":{"name":"Maaaagic","price":42,"description":"Just kiddin', no magic here. ✨",},}@app.post("/items/",openapi_extra={"requestBody":{"content":{"application/json":{"schema":{"required":["name","price"],"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"},"description":{"type":"string"},},}}},"required":True,},},)asyncdefcreate_item(request:Request):raw_body=awaitrequest.body()data=magic_data_reader(raw_body)returndata
En este ejemplo, no declaramos ningún modelo de Pydantic. De hecho, el cuerpo de la petición ni siquiera se analiza como JSON, se lee directamente como bytes, y la función magic_data_reader() se encargaría de analizarlo de alguna manera.
Sin embargo, podemos declarar el esquema esperado para el cuerpo de la petición.
Usando este mismo truco, podrías usar un modelo de Pydantic para definir el JSON Schema que luego se incluye en la sección personalizada del esquema de OpenAPI para la operación de ruta.
Y podrías hacer esto incluso si el tipo de dato de la petición no es JSON.
Por ejemplo, en esta aplicación no usamos la funcionalidad integrada de FastAPI para extraer el JSON Schema de los modelos de Pydantic ni la validación automática para JSON. De hecho, estamos declarando el tipo de contenido de la petición como YAML, no como JSON:
Sin embargo, aunque no estamos usando la funcionalidad integrada por defecto, seguimos usando un modelo de Pydantic para generar manualmente el JSON Schema para los datos que queremos recibir en YAML.
Luego usamos la petición directamente, y extraemos el cuerpo como bytes. Esto significa que FastAPI ni siquiera intentará analizar el payload de la petición como JSON.
Y luego en nuestro código, analizamos ese contenido YAML directamente, y luego estamos usando nuevamente el mismo modelo de Pydantic para validar el contenido YAML: