.../articles/

FastAPIのスキーマクラスをOpenAPIから生成する方法

PythonでAPIを構築する要件があり、フレームワークに比較的モダンなFastAPIを採用しました。FastAPIはバックエンドの開発を行えば自動でOepnApi定義を生成する機能が備わっていますが、今回はこれを使わず、事前に用意したOepnApi定義からFastAPIで利用するスキーマクラスを生成する方法を紹介します。

OpenAPI定義からFastAPIで利用するスキーマクラスを出力すると何が良いのか?

  • OpenAPI定義のみで設計の確認が可能
  • FastAPIでクラスを書く必要がなくなる

OpenAPIの準備

FastAPIのソースコードとOpenAPI定義は以下のような構成で準備します。
ちなみに定義ファイルのパスが generated/openapi.json となっているのは、openapi-generatorを利用してopenapi.jsonを生成していて、弊社ではよくこの構成で開発しています。

project
  L api
    L main.py         : FastAPIのmain.py
  L schema
    L generated
      L openapi.json  : OpenAPI定義ファイル

datamodel-code-generatorのインストール

OpenAPI定義からschemaクラスを生成するには、datamodel-code-generatorを利用します。以下のコマンドを実行してpython環境にインストールします。

# インストールコマンド
$ pip install datamodel-code-generator
$ datamodel-codegen --version
0.11.19

schemas.pyを出力する

次に、以下のコマンドを実行してスキーマファイルをFastAPIのプロジェクト内に出力します。

datamodel-codegen  --input /schema/generated/openapi.json --input-file-type openapi --output api/schemas.py

サンプルとして以下のOpenAPI定義で実行して、このようなpythonのソースコードが生成されました。

schema/generated/openapi.json

{
  "openapi" : "3.0.3",
  "info" : {
    "title" : "api",
    "version" : "0.0.1"
  },
  "servers" : [ {
    "url" : "/"
  } ],
  "tags" : [ {
    "description" : "index",
    "name" : "index"
  } ],
  "paths" : {
    "/" : {
      "post" : {
        "description" : "POST",
        "operationId" : "IndexPost",
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/IndexPostRequest"
              }
            }
          },
          "description" : "POST",
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/IndexPostResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "tags" : [ "index" ]
      }
    }
  },
  "components" : {
    "schemas" : {
      "IndexPostRequest" : {
        "properties" : {
          "name" : {
            "type" : "string"
          }
        },
        "type" : "object"
      },
      "IndexPostResponse" : {
        "properties" : {
          "hello" : {
            "type" : "string"
          }
        },
        "type" : "object"
      }
    }
  }
}

api/schemas.py

# generated by datamodel-codegen:
#   filename:  openapi.json
#   timestamp: 2022-02-25T07:02:11+00:00

from __future__ import annotations

from typing import Optional

from pydantic import BaseModel

class IndexPostRequest(BaseModel):
    name: Optional[str] = None

class IndexPostResponse(BaseModel):
    hello: Optional[str] = None

FastAPIの実装

生成したschemas.pyをFastAPIで実装してみます。
api/main.pyを以下のように変更しました。

api/main.py

from FastAPI import FastAPI

from schemas import IndexPostRequest, IndexPostResponse
app = FastAPI()

@app.post("/", response_model=IndexPostResponse)
def read_root(request:IndexPostRequest) -> IndexPostResponse:
    response = IndexPostResponse()
    response.hello = request.name
    return response

動作確認

FastAPIをローカル環境で動かして、以下のコマンドを実行して想定どおりに動いているかを確認します。

$ curl -X 'POST' \
  'http://0.0.0.0:8000/' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "World"
}'

{"hello":"World"}

想定した値が返ってきました。

まとめ

OpenAPIはこういったクラス生成ツールが充実していてとても良いですね。

.../articles/

Articles

記事

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

monorepo管理しているNext.jsをAmplifyにデプロイしようとした際にいくつか躓く内容があったのでまとめておきます。

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

コロナ禍の影響により、リモートワークの導入をおこなっている制作会社も多く、実際に弊社でも導入しています。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトのデザインは、「この形式」という決まりはありません。ECサイトで売り上げを上げるなら、しっかりとしたコンセプトと、コンセプトを決定するまでのリサーチが必要です。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

新型コロナウイルス感染拡大の影響で、リモートワークが主流になり、弊社でも週のほとんどは各自宅で作業をしています。

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaを利用するWebデザイナーの助けになれると嬉しいです。使い方は本記事をご覧ください。

ECの構築方法、おすすめのECサービス。

ECの構築方法、おすすめのECサービス。

ファッションや家電、スーパーの買い物でさえもECサイトを利用することが当たり前になりました。加えて新型コロナウイルスの影響もあり、弊社にも「どんなプラットフォームを利用したら良いか」「どれくらいコストがかかるのか」などECに関するさまざまなご相談を頂きます。

FastAPIのスキーマクラスをOpenAPIから生成する方法

FastAPIのスキーマクラスをOpenAPIから生成する方法

PythonでAPIを構築する要件があり、フレームワークに比較的モダンなFastAPIを採用しました。FastAPIはバックエンドの開発を行えば自動でOepnApi定義を生成する機能が備わっていますが、今回はこれを使わず、事前に用意したOepnApi定義からFastAPIで利用するスキーマクラスを生成する方法を紹介します。

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel + MySQLで全文検索を実装する

とあるPythonのソースで sys.path.append としたく無かった話

とあるPythonのソースで sys.path.append としたく無かった話

とあるプロジェクトのとあるソースコードのレビューをしてた時、「ソースコードの参照がうまくいってなかったので修正しました」とレビュー依頼がきました。 ディレクトリ構造 ``` module L __init__.py L main.py L tests L __init__.py L test_main.py ``` ソースコード ``` python tests/test_main.py sys.path.append(os.path.abspath("..")) from main import fuga ``` 今まで案件でPythonに触れる機会も結構ありましたが、なんとなく使ってきた部分も多く、この書き方が良いのか悪いのか判別できなかったので、改めてPythonのモジュールのインポートに関して調べてみたのでブログにしました。普段PHPを書いている事が多くPythonに関して何も分からないので初心者向けの内容になっていると思います。

GiFT1号目新卒デザイナーの2021年振り返り

GiFT1号目新卒デザイナーの2021年振り返り

いつの間に、年末ですね。入社してもう、9ヶ月も立っていたようです。2021年の振り返りを記事にしました。

すべての記事

お問い合わせ