コンテンツへスキップ

FastAPI

FastAPI

FastAPIフレームワーク、高性能、学習しやすい、コーディングが速い、本番環境対応

Test Coverage Package version Supported Python versions


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

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


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

主な機能は以下のとおりです。

  • 高速: **NodeJS**や**Go**と同等の非常に高いパフォーマンス(StarletteとPydanticのおかげ)。利用可能なPythonフレームワークの中で最速のものの1つです
  • 高速なコーディング: 機能開発速度を約200〜300%向上させます。*
  • バグが少ない: ヒューマンエラー(開発者によるエラー)を約40%削減します。*
  • 直感的: 優れたエディターサポート。あらゆる場所でコード補完。デバッグにかかる時間を短縮します。
  • 簡単: 使用と学習が容易になるように設計されています。ドキュメントを読む時間を短縮します。
  • 簡潔: コードの重複を最小限に抑えます。各パラメータ宣言から複数の機能が得られます。バグが少なくなります。
  • 堅牢: 本番環境対応のコードを取得します。自動インタラクティブドキュメント付き。
  • 標準ベース: APIのオープン標準であるOpenAPI(以前はSwaggerとして知られていました)とJSON Schemaに基づいており、完全に互換性があります。

* 本番アプリケーションを構築する内部開発チームによるテストに基づく推定値です。

スポンサー

その他のスポンサー

意見

"[...] 最近はFastAPIをたくさん使っています。 [...] 実際、チームのMicrosoftにおけるすべてのMLサービスにそれを利用する予定です。それらのいくつかは、Windows製品の中核およびいくつかのOffice製品に統合されています。"

Kabir Khan - Microsoft (参照)

"予測を取得するためにクエリできるRESTサーバーを生成するために、FastAPIライブラリを採用しました。[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をチェックしてください [...] それは高速で、使いやすく、学習しやすいです [...]"

APIにFastAPIを導入しました[...]気に入っていただけると思います[...]

イネス・モンターニ - マシュー・ホニバル - Explosion AI創設者 - spaCy開発者 (参照) - (参照)

本番環境向けのPython APIを構築しようとしているなら、FastAPIを強くお勧めします。見事に設計されており使いやすく非常にスケーラブルです。APIファースト開発戦略における重要なコンポーネントとなり、仮想TACエンジニアなどの多くの自動化やサービスを推進しています。

ディオン・ピルスベリー - シスコ (参照)

Typer、CLIのためのFastAPI

ウェブ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}

注記:

わからない場合は、ドキュメントの「急いでいますか?」セクションにあるドキュメントの`async`と`await`に関する情報を確認してください。

実行

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

$ 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にアクセスします。

(Swagger UIによって提供される)自動生成されたインタラクティブなAPIドキュメントが表示されます。

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`オブジェクト。
    • データベースモデル。
    • …その他多数。
  • 2つの代替ユーザーインターフェースを含む、自動生成されたインタラクティブなAPIドキュメント。
    • Swagger UI。
    • ReDoc。

前のコード例に戻ると、FastAPI

  • `GET`および`PUT`リクエストのパスに`item_id`が存在することを検証します。
  • `GET`および`PUT`リクエストの`item_id`が`int`型であることを検証します。
    • そうでない場合、クライアントには分かりやすいエラーが表示されます。
  • `GET`リクエストに対して、`q`という名前のオプションのクエリパラメータ(`http://127.0.0.1:8000/items/foo?q=somequery`のように)が存在するかどうかを確認します。
    • `q`パラメータは`= None`で宣言されているため、オプションです。
    • `None`がないと、必須になります(`PUT`の場合のボディのように)。
  • `/items/{item_id}`への`PUT`リクエストの場合、ボディをJSONとして読み取ります。
    • `str`型である必要がある必須属性`name`があることを確認します。
    • `float`型である必要がある必須属性`price`があることを確認します。
    • 存在する場合は、オプション属性`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_length`や`regex`などの検証制約の設定方法。
  • 非常に強力で使いやすい依存性注入システム。
  • JWTトークンHTTP Basic認証を使用したOAuth2のサポートを含む、セキュリティと認証。
  • (Pydanticのおかげで)深くネストされたJSONモデルを宣言するためのより高度な(しかし同様に簡単な)テクニック。
  • Strawberryなどのライブラリを使用したGraphQL統合。
  • Starletteのおかげで、以下のような多くの追加機能も提供されます。
    • WebSockets
    • HTTPXと`pytest`に基づく非常に簡単なテスト。
    • CORS。
    • Cookieセッション。
    • …その他多数。

パフォーマンス

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

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

依存関係

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

standard依存関係

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

Pydantic によって使用されます。

Starlette によって使用されます。

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

FastAPI / Starlette によって使用されます。

  • uvicorn - アプリケーションをロードして提供するサーバー用です。これには、高性能な提供に必要ないくつかの依存関係(例:uvloop)を含む uvicorn[standard] も含まれます。
  • fastapi-cli - fastapi コマンドを提供します。

standard 依存関係なし

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

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

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

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

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

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

ライセンス

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