FastAPIを使ってとりあえず、swaggerにそれっぽいAPIの使い方を表示したい


概要

とにかく、とりあえず、FastAPIのswaggerの画面にAPIからのレスポンスの形を定義したり、
レスポンスのサンプルを表示したりしたい人向けの記事。

ぼくがそうだったのだけれども、そういう記事やblogが見つけられなくて、
ひとまず fastapi公式のチュートリアル を一通りこなしたのもあって、
同じ目的を持つ人の一助けになればと思って書いた。

前提

  • こういう形のデータがレスポンスとして返ってくるとする。
{
    "Special_choco1": {
      "Milk": "many",
      "Quantity": 5,
      "Cacao": "a little"
    },
    "Store":[
      {
        "Tokyo": "sibuya",
        "Hokkaido": "sapporo",
        "Osaka": "nanba"
      }
    ]
}
  • FastAPIのバージョンは 0.52.0

  • main.pyに書く
    app=FastAPI() って書くファイルに書く。

  • きっと他にもっと良い書き方がある。

まずはレスポンスの形を定義する

from fastapi import FastAPI
from pydantic import BaseModel
from typing import List

class choco_model(BaseModel):
    Milk: str
    Quantity: int
    Cacao: str

class Store_model(BaseModel):
    Tokyo: str
    Hokkaido: str
    Osaka: str

class Special_choco(BaseModel):
    Special_choco1: choco_model
    Store: List[Store_model]

app = FastAPI()

@app.get("/api/v1/chocolate/{name}")
async def making_choco(name: str):
    return # 後略。前提に記載したJSONが変える様な感じのものを書くイメージ。

Example Valueに定義したモデルを表示させる

デコレータのところのresponse_modelに定義したいモデルを指定する。
そうすると、swaggerのExample Value のところに表示されるようになる。

# 前略)

app = FastAPI()

@app.get("/api/v1/chocolate/{name}", response_model=Special_choco)
async def making_choco(name: str):
    return # 後略。前提に記載したJSONが変える様な感じのものを書くイメージ。

こんな感じ。

より具体的にExample Valueを表示する。

型やデータの構造だけではなく、具体的にどんな値が返ってくるのかを表示するには、
定義の部分に表示したいデータを以下のように、class Config 内に記載する。
そうすると、具体的な値がexample value の欄に入った状態で表示される。

from fastapi import FastAPI
from pydantic import BaseModel
from typing import List


class choco_model(BaseModel):
    Milk: str
    Quantity: int
    Cacao: str
    class Config:
        schema_extra = {
            "example": {
                "Milk": "very lot",
                "Quantity": 10,
                "Cacao": "many",
            }
        }

class Store_model(BaseModel):
    Tokyo: str
    Hokkaido: str
    Osaka: str

    class Config:
        schema_extra = {
            "example": {
                "Tokyo": "shibuya",
                "Hokkaido": "sapporo",
                "Osaka": "nishinari",
            }
        }
# 後略

以下のように表示される。

最後に

fastapi公式チュートリアル はボリュームが多いけども、やっておくとためになるのよいです。