コンテンツへスキップ

FastAPI

FastAPI

FastAPI フレームワーク、高性能、学習が容易、コーディングが迅速、本番環境対応

Test Coverage Package version Supported Python versions


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

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


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

主な機能

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

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

スポンサー

その他のスポンサー

意見

[...] 最近、私は 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 をチェックしてみてください。[...] 高速で、使いやすく、学習しやすいです [...]

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

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

本番環境の Python API を構築しようとしている人には、FastAPI を強くお勧めします。美しく設計され使いやすく高いスケーラビリティを備えています。これは当社の API ファースト開発戦略の重要なコンポーネントとなり、仮想 TAC エンジニアのような多くの自動化とサービスを推進しています。

Deon Pillsbury - Cisco (参照)

CLI 版 FastAPI である Typer

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}

注意:

不明な場合は、ドキュメントの 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 に移動します。

自動インタラクティブ 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 Basic認証によるOAuth2のサポートを含む、セキュリティと認証。
  • 深くネストされたJSONモデルを宣言するための、より高度な(しかし同様に簡単な)テクニック(Pydanticのおかげです)。
  • Strawberry や他のライブラリとの GraphQL 統合。
  • その他多くの機能 (Starlette のおかげです)。
    • WebSockets
    • HTTPX と pytest に基づく非常に簡単なテスト
    • CORS
    • Cookie セッション
    • ...その他。

パフォーマンス

独立した TechEmpower ベンチマークによると、Uvicorn 下で実行される FastAPI アプリケーションは、利用可能な Python フレームワークの中で最速の1つであり、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 ライセンスの条件に基づいてライセンスされています。