コンテンツへスキップ

FastAPI

FastAPI

FastAPIフレームワーク、高性能、習得が容易、コーディングが速い、プロダクション対応

Test Coverage Package version Supported Python versions


ドキュメント: https://fastapi.dokyumento.jp

ソースコード: https://github.com/fastapi/fastapi


FastAPIは、標準のPython型ヒントに基づいてAPIを構築するための、モダンで高速(高性能)なWebフレームワークです。

主な機能は次のとおりです

  • 高速: 非常に高いパフォーマンスで、NodeJSGoと同等です(StarletteとPydanticのおかげ)。利用可能なPythonフレームワークの中で最速の一つです。
  • コーディングが速い: 機能開発の速度を約200%から300%向上させます。 *
  • バグが少ない: 人為的な(開発者による)エラーを約40%削減します。 *
  • 直感的: 優れたエディタサポート。補完がどこでも利用できます。デバッグにかかる時間が短縮されます。
  • 簡単: 使いやすく、学びやすいように設計されています。ドキュメントを読む時間が短縮されます。
  • 簡潔: コードの重複を最小限に抑えます。各パラメータ宣言から複数の機能が得られます。バグが少なくなります。
  • 堅牢: 自動対話型ドキュメントを備えた、プロダクション対応のコードを入手できます。
  • 標準ベース: APIのオープンスタンダード(OpenAPI(旧称Swagger)とJSON Schema)に基づき、完全に互換性があります。

*プロダクションアプリケーションを構築する社内開発チームでのテストに基づく推定です。

スポンサー

その他のスポンサー

意見

"[...] 最近、FastAPIをたくさん使っています。[...] 実際、MicrosoftのチームのMLサービスすべてに使う予定です。その中には、コアのWindows製品や一部のOffice製品に統合されるものもあります。"

Kabir Khan - Microsoft (参照)

"私たちはFastAPIライブラリを採用し、予測を取得するためにクエリ可能なRESTサーバーを立ち上げました。[Ludwig向け]"

Piero Molino、Yaroslav Dudin、Sai Sumanth Miryala - Uber (参照)

"Netflixは、当社の危機管理オーケストレーションフレームワークであるDispatchのオープンソースリリースを発表します![FastAPIで構築]"

Kevin Glisson、Marc Vilanova、Forest Monsen - Netflix (参照)

"FastAPIにものすごく興奮しています。本当に楽しい!"

Brian Okken - Python Bytes ポッドキャストホスト (参照)

"正直に言うと、あなたが作ったものは非常に堅牢で洗練されているように見えます。多くの点で、私がHugに求めていたものです。誰かがそれを構築するのを見るのは本当に刺激的です。"

Timothy Crosley - Hug の作者 (参照)

"REST APIを構築するためのモダンなフレームワークを学びたいなら、FastAPIをチェックしてください [...] 高速で、使いやすく、習得も簡単です [...]"

"私たちはFastAPIAPIに切り替えました [...] きっと気に入るはずです [...]"

Ines Montani - Matthew Honnibal - Explosion AI 創設者 - spaCy の作者 (参照) - (参照)

"プロダクションPython APIの構築を考えている人には、FastAPIを強くお勧めします。美しく設計され使いやすく高いスケーラビリティを持ち、当社のAPIファースト開発戦略における主要なコンポーネントとなり、仮想TACエンジニアなどの多くの自動化とサービスを推進しています。"

Deon Pillsbury - Cisco (参照)

Typer、CLI 版 FastAPI

Web APIの代わりにターミナルで使用するCLIアプリを構築する場合は、Typerをチェックしてください。

TyperはFastAPIの弟分です。そして、CLI版FastAPIとなることを目指しています。⌨️ 🚀

要件

FastAPI は巨人の肩の上に立っています

インストール

仮想環境を作成してアクティベートし、FastAPIをインストールします。

$ pip install "fastapi[standard]"

---> 100%

: すべてのターミナルで動作するように、"fastapi[standard]"を引用符で囲んでください。

作成

main.py というファイルを作成し、次の内容を記述します

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}
または async def を使用...

コードがasync / awaitを使用する場合は、async defを使用します。

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

Note:

ご不明な場合は、ドキュメントの 「お急ぎですか?」セクションの asyncawait を確認してください。

実行

次のコマンドでサーバーを実行します。

$ fastapi dev main.py

 ╭────────── FastAPI CLI - Development mode ───────────╮
 │                                                     │
 │  Serving at: http://127.0.0.1:8000                  │
 │                                                     │
 │  API docs: http://127.0.0.1:8000/docs               │
 │                                                     │
 │  Running in development mode, for production use:   │
 │                                                     │
 │  fastapi run                                        │
 │                                                     │
 ╰─────────────────────────────────────────────────────╯

INFO:     Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [2248755] using WatchFiles
INFO:     Started server process [2248757]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
コマンド fastapi dev main.py について...

fastapi devコマンドは、main.pyファイルを読み込み、その中のFastAPIアプリケーションを検出し、Uvicornを使用してサーバーを起動します。

デフォルトでは、fastapi dev はローカル開発用に自動リロードを有効にして起動します。

詳細については、FastAPI CLIドキュメントをご覧ください。

確認

ブラウザで http://127.0.0.1:8000/items/5?q=somequery を開きます。

JSONレスポンスは以下のようになります。

{"item_id": 5, "q": "somequery"}

あなたはすでに以下のAPIを作成しました

  • / および /items/{item_id}パスでHTTPリクエストを受信します。
  • 両方のパスGET操作(HTTPメソッドとも呼ばれます)を受け付けます。
  • パス /items/{item_id} には、intであるべきパスパラメータ item_id があります。
  • パス /items/{item_id} には、オプションの str クエリパラメータ q があります。

インタラクティブ API ドキュメント

では、http://127.0.0.1:8000/docs にアクセスしてください。

自動インタラクティブ API ドキュメント (Swagger UI が提供) が表示されます。

Swagger UI

代替 API ドキュメント

次に、http://127.0.0.1:8000/redoc にアクセスしてください。

代替の自動ドキュメント (ReDoc が提供) が表示されます。

ReDoc

例のアップグレード

今、main.py ファイルを修正して、PUT リクエストからボディを受け取るようにします。

Pydanticのおかげで、標準のPython型を使用してボディを宣言します。

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Union[bool, None] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}


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

fastapi dev サーバーは自動的にリロードされるはずです。

対話型APIドキュメントのアップグレード

では、http://127.0.0.1:8000/docs にアクセスしてください。

  • 対話型APIドキュメントは、新しいボディを含めて自動的に更新されます。

Swagger UI

  • 「試す」ボタンをクリックすると、パラメータを入力してAPIと直接対話できます。

Swagger UI interaction

  • 次に、「実行」ボタンをクリックすると、ユーザーインターフェースがAPIと通信し、パラメータを送信し、結果を取得して画面に表示します。

Swagger UI interaction

代替APIドキュメントのアップグレード

次に、http://127.0.0.1:8000/redoc にアクセスしてください。

  • 代替ドキュメントも新しいクエリパラメータとボディを反映します。

ReDoc

まとめ

要約すると、関数パラメータとして、パラメータの型、ボディなどを一度だけ宣言します。

それは標準的なモダンなPythonの型で行います。

新しい構文、特定のライブラリのメソッドやクラスなどを学ぶ必要はありません。

単なる標準のPythonです。

例えば、int の場合

item_id: int

またはより複雑なItemモデルの場合

item: Item

...そしてその単一の宣言で、次のような機能が得られます

  • エディタサポート、次を含む
    • 補完。
    • 型チェック。
  • データの検証
    • データが無効な場合の自動的かつ明確なエラー。
    • 深くネストされたJSONオブジェクトの検証も可能です。
  • 入力データの変換: ネットワークからPythonデータと型への変換。以下から読み込みます
    • JSON。
    • パスパラメータ。
    • クエリパラメータ。
    • クッキー。
    • ヘッダー。
    • フォーム。
    • ファイル。
  • 出力データの変換: Pythonデータと型をネットワークデータ(JSONなど)に変換する
    • Pythonの型 (str, int, float, bool, list など) を変換します。
    • datetime オブジェクト。
    • UUID オブジェクト。
    • データベースモデル。
    • ...その他多数。
  • 自動対話型APIドキュメント、2つの代替ユーザーインターフェースを含む
    • Swagger UI。
    • ReDoc。

前のコード例に戻ると、FastAPIは次のことを行います

  • GET および PUT リクエストのパスに item_id があることを検証します。
  • GET および PUT リクエストの場合、item_idint 型であることを検証します。
    • そうでなければ、クライアントには役立つ明確なエラーが表示されます。
  • GET リクエストの場合、q という名前のオプションのクエリパラメータがあるかを確認します (例: http://127.0.0.1:8000/items/foo?q=somequery)。
    • qパラメータは= Noneで宣言されているため、オプションです。
    • Noneがない場合、それは必須となります(PUTの場合のボディと同様)。
  • /items/{item_id} への PUT リクエストの場合、ボディをJSONとして読み込みます
    • 必須属性 namestr であることを確認します。
    • 必須属性 pricefloat であることを確認します。
    • オプション属性 is_offer が存在する場合、それが bool であることを確認します。
    • これらすべては、深くネストされたJSONオブジェクトでも機能します。
  • JSONとの間の自動変換。
  • OpenAPIですべてを文書化し、以下の用途に利用できます
    • インタラクティブなドキュメンテーションシステム。
    • 多くの言語に対応する自動クライアントコード生成システム。
  • 2つの対話型ドキュメントWebインターフェースを直接提供します。

まだ表面をなぞっただけですが、どのように機能するかはおおよそ理解できたと思います。

次の行を変更してみてください。

    return {"item_name": item.name, "item_id": item_id}

...から

        ... "item_name": item.name ...

...へ

        ... "item_price": item.price ...

...そして、エディタがどのように属性を自動補完し、その型を認識するかを見てください。

editor support

より多くの機能を含む完全な例については、チュートリアル - ユーザーガイドを参照してください。

ネタバレ注意: チュートリアル - ユーザーガイドには以下が含まれています

  • ヘッダークッキーフォームフィールドファイルなど、他の様々な場所からのパラメータの宣言。
  • maximum_lengthregex など、検証制約を設定する方法。
  • 非常に強力で使いやすい依存性注入システム。
  • JWTトークンHTTP基本認証を用いたOAuth2のサポートを含む、セキュリティと認証。
  • 深くネストされたJSONモデルを宣言するための、より高度な(しかし同様に簡単な)手法(Pydanticのおかげ)。
  • Strawberryや他のライブラリとのGraphQL統合。
  • 他にも(Starletteのおかげで)多くの追加機能があります
    • WebSockets
    • HTTPXとpytestに基づく非常に簡単なテスト
    • CORS
    • クッキーセッション
    • ...など。

パフォーマンス

独立したTechEmpowerベンチマークによると、Uvicornで実行されているFastAPIアプリケーションは、利用可能なPythonフレームワークの中で最速の一つであり、StarletteとUvicorn自身(FastAPIの内部で使用されている)に次ぐ位置にあります。(*)

詳細については、ベンチマークのセクションを参照してください。

依存性注入

FastAPIはPydanticとStarletteに依存しています。

standard 依存関係

FastAPIをpip install "fastapi[standard]"でインストールすると、standardグループのオプションの依存関係が付属します。

Pydanticで使用されるもの

Starletteで使用されるもの

  • httpx - TestClientを使用する場合に必須。
  • jinja2 - デフォルトのテンプレート設定を使用する場合に必須。
  • python-multipart - request.form() を使用してフォームの「パース」をサポートする場合に必須。

FastAPIで使用されるもの

  • uvicorn - アプリケーションをロードして提供するサーバー用。これにはuvicorn[standard]が含まれ、高性能な提供に必要な依存関係(例:uvloop)が含まれています。
  • fastapi-cli[standard] - fastapiコマンドを提供するため。
    • これにはfastapi-cloud-cliが含まれており、FastAPIアプリケーションをFastAPI Cloudにデプロイできます。

standard 依存関係なし

standard オプションの依存関係を含めたくない場合は、pip install "fastapi[standard]"の代わりにpip install fastapiでインストールできます。

fastapi-cloud-cliなし

FastAPIを標準の依存関係付きでインストールしたいが、fastapi-cloud-cliなしでインストールしたい場合は、pip install "fastapi[standard-no-fastapi-cloud-cli]"でインストールできます。

追加のオプション依存関係

インストールしたい追加の依存関係がいくつかあります。

追加のPydanticオプション依存関係

追加のFastAPIオプション依存関係

  • orjson - ORJSONResponse を使用する場合に必須です。
  • ujson - UJSONResponse を使用する場合に必須です。

ライセンス

このプロジェクトはMITライセンスの条件に基づいてライセンスされています。