FastAPI¶
FastAPIフレームワーク、高性能、習得が容易、コーディングが速い、プロダクション対応
ドキュメント: https://fastapi.dokyumento.jp
ソースコード: https://github.com/fastapi/fastapi
FastAPIは、標準のPython型ヒントに基づいてAPIを構築するための、モダンで高速(高性能)なWebフレームワークです。
主な機能は次のとおりです
- 高速: 非常に高いパフォーマンスで、NodeJSやGoと同等です(StarletteとPydanticのおかげ)。利用可能なPythonフレームワークの中で最速の一つです。
- コーディングが速い: 機能開発の速度を約200%から300%向上させます。 *
- バグが少ない: 人為的な(開発者による)エラーを約40%削減します。 *
- 直感的: 優れたエディタサポート。補完がどこでも利用できます。デバッグにかかる時間が短縮されます。
- 簡単: 使いやすく、学びやすいように設計されています。ドキュメントを読む時間が短縮されます。
- 簡潔: コードの重複を最小限に抑えます。各パラメータ宣言から複数の機能が得られます。バグが少なくなります。
- 堅牢: 自動対話型ドキュメントを備えた、プロダクション対応のコードを入手できます。
- 標準ベース: APIのオープンスタンダード(OpenAPI(旧称Swagger)とJSON Schema)に基づき、完全に互換性があります。
*プロダクションアプリケーションを構築する社内開発チームでのテストに基づく推定です。
スポンサー¶
意見¶
"[...] 最近、FastAPIをたくさん使っています。[...] 実際、MicrosoftのチームのMLサービスすべてに使う予定です。その中には、コアのWindows製品や一部のOffice製品に統合されるものもあります。"
"私たちはFastAPIライブラリを採用し、予測を取得するためにクエリ可能なRESTサーバーを立ち上げました。[Ludwig向け]"
"Netflixは、当社の危機管理オーケストレーションフレームワークであるDispatchのオープンソースリリースを発表します![FastAPIで構築]"
"FastAPIにものすごく興奮しています。本当に楽しい!"
"正直に言うと、あなたが作ったものは非常に堅牢で洗練されているように見えます。多くの点で、私がHugに求めていたものです。誰かがそれを構築するのを見るのは本当に刺激的です。"
"REST APIを構築するためのモダンなフレームワークを学びたいなら、FastAPIをチェックしてください [...] 高速で、使いやすく、習得も簡単です [...]"
"私たちはFastAPIをAPIに切り替えました [...] きっと気に入るはずです [...]"
"プロダクションPython APIの構築を考えている人には、FastAPIを強くお勧めします。美しく設計され、使いやすく、高いスケーラビリティを持ち、当社のAPIファースト開発戦略における主要なコンポーネントとなり、仮想TACエンジニアなどの多くの自動化とサービスを推進しています。"
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:
ご不明な場合は、ドキュメントの 「お急ぎですか?」セクションの 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 が提供) が表示されます。

代替 API ドキュメント¶
次に、http://127.0.0.1:8000/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ドキュメントは、新しいボディを含めて自動的に更新されます。

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

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

代替APIドキュメントのアップグレード¶
次に、http://127.0.0.1:8000/redoc にアクセスしてください。
- 代替ドキュメントも新しいクエリパラメータとボディを反映します。

まとめ¶
要約すると、関数パラメータとして、パラメータの型、ボディなどを一度だけ宣言します。
それは標準的なモダンなPythonの型で行います。
新しい構文、特定のライブラリのメソッドやクラスなどを学ぶ必要はありません。
単なる標準のPythonです。
例えば、int の場合
item_id: int
またはより複雑なItemモデルの場合
item: Item
...そしてその単一の宣言で、次のような機能が得られます
- エディタサポート、次を含む
- 補完。
- 型チェック。
- データの検証
- データが無効な場合の自動的かつ明確なエラー。
- 深くネストされたJSONオブジェクトの検証も可能です。
- 入力データの変換: ネットワークからPythonデータと型への変換。以下から読み込みます
- JSON。
- パスパラメータ。
- クエリパラメータ。
- クッキー。
- ヘッダー。
- フォーム。
- ファイル。
- 出力データの変換: Pythonデータと型をネットワークデータ(JSONなど)に変換する
- Pythonの型 (
str,int,float,bool,listなど) を変換します。 datetimeオブジェクト。UUIDオブジェクト。- データベースモデル。
- ...その他多数。
- Pythonの型 (
- 自動対話型APIドキュメント、2つの代替ユーザーインターフェースを含む
- 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として読み込みます- 必須属性
nameがstrであることを確認します。 - 必須属性
priceがfloatであることを確認します。 - オプション属性
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 ...
...そして、エディタがどのように属性を自動補完し、その型を認識するかを見てください。

より多くの機能を含む完全な例については、チュートリアル - ユーザーガイドを参照してください。
ネタバレ注意: チュートリアル - ユーザーガイドには以下が含まれています
- ヘッダー、クッキー、フォームフィールド、ファイルなど、他の様々な場所からのパラメータの宣言。
maximum_lengthやregexなど、検証制約を設定する方法。- 非常に強力で使いやすい依存性注入システム。
- 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で使用されるもの
email-validator- メールアドレスの検証用。
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オプション依存関係
pydantic-settings- 設定管理用。pydantic-extra-types- Pydanticで使用する追加の型用。
追加のFastAPIオプション依存関係
ライセンス¶
このプロジェクトはMITライセンスの条件に基づいてライセンスされています。











