fromtypingimportUnionfromfastapiimportFastAPIfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:strdescription:Union[str,None]=Noneprice:floattax:Union[float,None]=Nonemodel_config={"json_schema_extra":{"examples":[{"name":"Foo","description":"A very nice Item","price":35.4,"tax":3.2,}]}}@app.put("/items/{item_id}")asyncdefupdate_item(item_id:int,item:Item):results={"item_id":item_id,"item":item}returnresults
Essas informações extras serão adicionadas como se encontram no JSON Schema de resposta desse modelo e serão usadas na documentação da API.
Dica
Você pode usar a mesma técnica para estender o JSON Schema e adicionar suas próprias informações extras de forma personalizada.
Por exemplo, você pode usar isso para adicionar metadados para uma interface de usuário de front-end, etc.
Ao usar Field () com modelos Pydantic, você também pode declarar informações extras para o JSON Schema passando quaisquer outros argumentos arbitrários para a função.
Você pode usar isso para adicionar um example para cada campo:
fromtypingimportUnionfromfastapiimportFastAPIfrompydanticimportBaseModel,Fieldapp=FastAPI()classItem(BaseModel):name:str=Field(examples=["Foo"])description:Union[str,None]=Field(default=None,examples=["A very nice Item"])price:float=Field(examples=[35.4])tax:Union[float,None]=Field(default=None,examples=[3.2])@app.put("/items/{item_id}")asyncdefupdate_item(item_id:int,item:Item):results={"item_id":item_id,"item":item}returnresults
Atenção
Lembre-se de que esses argumentos extras passados não adicionarão nenhuma validação, apenas informações extras, para fins de documentação.
Aqui nós passamos um example dos dados esperados por Body():
fromtypingimportUnionfromfastapiimportBody,FastAPIfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:strdescription:Union[str,None]=Noneprice:floattax:Union[float,None]=None@app.put("/items/{item_id}")asyncdefupdate_item(item_id:int,item:Item=Body(examples=[{"name":"Foo","description":"A very nice Item","price":35.4,"tax":3.2,}],),):results={"item_id":item_id,"item":item}returnresults
Alternativamente ao único example, você pode passar examples usando um dict com vários examples, cada um com informações extras que serão adicionadas no OpenAPI também.
As chaves do dict identificam cada exemplo, e cada valor é outro dict.
Cada dict de exemplo específico em examples pode conter:
summary: Pequena descrição do exemplo.
description: Uma descrição longa que pode conter texto em Markdown.
value: O próprio exemplo mostrado, ex: um dict.
externalValue: alternativa ao value, uma URL apontando para o exemplo. Embora isso possa não ser suportado por tantas ferramentas quanto value.
fromtypingimportUnionfromfastapiimportBody,FastAPIfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:strdescription:Union[str,None]=Noneprice:floattax:Union[float,None]=None@app.put("/items/{item_id}")asyncdefupdate_item(*,item_id:int,item:Item=Body(examples=[{"name":"Foo","description":"A very nice Item","price":35.4,"tax":3.2,},{"name":"Bar","price":"35.4",},{"name":"Baz","price":"thirty five point four",},],),):results={"item_id":item_id,"item":item}returnresults
Esses são detalhes muito técnicos sobre os padrões JSON Schema e OpenAPI.
Se as ideias explicadas acima já funcionam para você, isso pode ser o suficiente, e você provavelmente não precisa desses detalhes, fique à vontade para pular.
Quando você adiciona um exemplo dentro de um modelo Pydantic, usando schema_extra ouField(example="something")esse exemplo é adicionado ao JSON Schema para esse modelo Pydantic.
E esse JSON Schema do modelo Pydantic está incluído no OpenAPI da sua API e, em seguida, é usado na UI da documentação.
O JSON Schema na verdade não tem um campo example nos padrões. Versões recentes do JSON Schema definem um campo examples, mas o OpenAPI 3.0.3 é baseado numa versão mais antiga do JSON Schema que não tinha examples.
Por isso, o OpenAPI 3.0.3 definiu o seu próprio example para a versão modificada do JSON Schema que é usada, para o mesmo próposito (mas é apenas example no singular, não examples), e é isso que é usado pela UI da documentação da API(usando o Swagger UI).
Portanto, embora example não seja parte do JSON Schema, é parte da versão customizada do JSON Schema usada pelo OpenAPI, e é isso que vai ser usado dentro da UI de documentação.
Mas quando você usa example ou examples com qualquer um dos outros utilitários (Query(), Body(), etc.) esses exemplos não são adicionados ao JSON Schema que descreve esses dados (nem mesmo para versão própria do OpenAPI do JSON Schema), eles são adicionados diretamente à declaração da operação de rota no OpenAPI (fora das partes do OpenAPI que usam o JSON Schema).
Por outro lado, há uma versão mais recente do OpenAPI: 3.1.0, lançada recentemente. Baseado no JSON Schema mais recente e a maioria das modificações da versão customizada do OpenAPI do JSON Schema são removidas, em troca dos recursos das versões recentes do JSON Schema, portanto, todas essas pequenas diferenças são reduzidas. No entanto, a UI do Swagger atualmente não oferece suporte a OpenAPI 3.1.0, então, por enquanto, é melhor continuar usando as opções acima.