1. 程式人生 > 其它 >FastAPI學習-9. Swagger文件輸出請求示例example

FastAPI學習-9. Swagger文件輸出請求示例example

前言

可以在 Swagger文件上看到請求示例example,使用Pydantic schema_extra屬性來實現。

schema_extra

使用 Config 和 schema_extra 為Pydantic模型宣告一個示例,如Pydantic 文件:定製 Schema 中所述:

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

    class Config:
        schema_extra = {
            "example": {
                "name": "Foo",
                "description": "A very nice Item",
                "price": 35.4,
                "tax": 3.2,
            }
        }


@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    results = {"item_id": item_id, "item": item}
    return results

這些額外的資訊將按原樣新增到輸出的JSON模式中。

Field 的附加引數

在 Field, Path, Query, Body 和其他你之後將會看到的工廠函式,你可以為JSON 模式宣告額外資訊,你也可以通過給工廠函式傳遞其他的任意引數來給JSON 模式宣告額外資訊,比如增加 example:

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str = Field(..., example="Foo")
    description: Optional[str] = Field(None, example="A very nice Item")
    price: float = Field(..., example=35.4)
    tax: Optional[float] = Field(None, example=3.2)


@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    results = {"item_id": item_id, "item": item}
    return results

請記住,傳遞的那些額外引數不會新增任何驗證,只會添加註釋,用於文件的目的。

Body 額外引數

你可以通過傳遞額外資訊給 Field 同樣的方式操作Path, Query, Body等。
比如,你可以將請求體的一個 example 傳遞給 Body:

from typing import Optional

from fastapi import Body, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None


@app.put("/items/{item_id}")
async def update_item(
    item_id: int,
    item: Item = Body(
        ...,
        example={
            "name": "Foo",
            "description": "A very nice Item",
            "price": 35.4,
            "tax": 3.2,
        },
    ),
):
    results = {"item_id": item_id, "item": item}
    return results

文件 UI 中的例子

使用上面的任何方法,它在 /docs 中看起來都是這樣的:

技術細節

關於 example 和 examples...
JSON Schema在最新的一個版本中定義了一個欄位 examples ,但是 OpenAPI 基於之前的一箇舊版JSON Schema,並沒有 examples.
所以 OpenAPI為了相似的目的定義了自己的 example (使用 example, 而不是 examples), 這也是文件 UI 所使用的 (使用 Swagger UI).
所以,雖然 example 不是JSON Schema的一部分,但它是OpenAPI的一部分,這將被文件UI使用。