FastAPI¶
FastAPIフレームワーク、高性能、学習しやすい、コーディングが速い、本番環境対応
ドキュメント: 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製品に統合されています。"
"予測を取得するためにクエリできるRESTサーバーを生成するために、FastAPIライブラリを採用しました。[Ludwig用]"
"Netflixは、当社の危機管理オーケストレーションフレームワーク:Dispatchのオープンソースリリースを発表できることを嬉しく思います![FastAPIを使用して構築]"
"FastAPIに夢中です。とても楽しい!"
"正直なところ、あなたが作ったものはとても堅牢で洗練されているように見えます。多くの点で、それは私がHugに望んでいたものでした - 誰かがそれを構築するのを見るのは本当に刺激的です。"
"REST APIを構築するための最新のフレームワークを学習したいと考えているなら、FastAPIをチェックしてください [...] それは高速で、使いやすく、学習しやすいです [...]"
「APIにFastAPIを導入しました[...]気に入っていただけると思います[...]」
「本番環境向けの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ドキュメントが表示されます。
代替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`オブジェクト。
- データベースモデル。
- …その他多数。
- 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 ...
…そして、エディターが属性の自動補完を行い、型を認識することを確認してください。
より多くの機能を含む完全な例については、チュートリアル - ユーザーガイドを参照してください。
ネタバレ注意:チュートリアル - ユーザーガイドには以下が含まれています。
- ヘッダー、クッキー、フォームフィールド、ファイルなど、さまざまな場所からのパラメータの宣言。
- `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 によって使用されます。
email-validator
- メールアドレス検証用。
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 依存関係
pydantic-settings
- 設定管理用。pydantic-extra-types
- Pydantic で使用する追加の型用。
追加のオプション FastAPI 依存関係
ライセンス¶
このプロジェクトは MIT ライセンスの条件に基づいてライセンスされています。