FastAPIの開発体験が良かった話

技術FastAPI感想

はじめに

Python ベースの Web マイクロフレームワークの一つ、FastAPIで API を作る機会があり、開発体験が良かったのでその感想です。

良かった点

シンプルな設計

大規模アプリケーションでなく、モック API や簡単な RESTful API を作るなどといった、ちょっとした用途でアプリケーションを作る場合は、できれば最小限のファイル・ディレクトリで構成したいというのが個人的な好みです。

例えばSpring Bootでアプリケーションを作る場合、jvm 言語特有で「最初のプロジェクトから、複数のパッケージとファイルで構成されている」のですが、FastAPIでは言ってしまえば、1 ファイルでアプリケーションを実行できます。Node.jsの Web フレームワークExpressみたいに構成できるので嬉しいです。

例:GET リクエストを受け取るのみの API を作る場合、1 ファイルのみで以下のようにコードを記述するだけで OK

from fastapi import FastAPI, Query
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/hoge")
def getHoge(id: str = Query(...)) -> JSONResponse:
  # ここでクエリパラメータを受け取り、レスポンスを作る
  # jsonでレスポンスを返す
  return JSONResponse(status_code=200, content={"body": "hoge"})

直感的な理解のしやすさ

アノテーションベースでリクエストハンドラーを書けるので、ぱっと見で何をやっているのか理解しやすいです。実際に上で書いたサンプルコードをみて、「hogeというエンドポイントにidというパラメータがついた URI でコールされたとき、中身 json で 200 のレスポンスが返る」と理解はできますよね。(引数idがクエリパラメータとぱっと見でわかるかどうかは、SpringNestJSで書いたことがあるかによりそうな気がしないこともないが。。自分はSpringを業務で使っているのでスッと腑に落ちました)

Pydantic との組み合わせることで受けられる恩恵の大きさ

PydanticFastAPIを組み合わせることで、

  • 型アノテーションを使用することで、バリデーション・シリアライズが容易
  • OpenAPIスキーマの自動生成により、仕様書作成が容易

が簡単に実現できます。特にリクエストボディに対して、バリデーション機構をスクラッチから書くことなくPydanticBaseModelFastAPIQueryの組み合わせでかけるのはすごく楽。。

また、自動生成されたOpenAPIスキーマをSwaggerUIRedocでドキュメント化できるのもクールです!!(当然 description など全てコード内に書いてあげる必要はありますが)

最後に

機械学習のモデルを利用した API や簡単なモックを作る必要があるときはFastAPIを採用したいです。FastAPIはいいぞ。

というかまずPythonが型アノテーションの追加などでさらに書きやすくなってて嬉しかったです!久々書いてて「これよこれ」と実家に帰った感覚がありました。

FastAPIは現在いまだにバージョン 0.X.X の状態なので、開発が本当に盛んです。ぜひ興味があればコントリビュートしてみてはいかがでしょうか!!