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 スキーマ) に基づいており、完全に互換性があります。
* 本番アプリケーションを構築する内部開発チームでのテストに基づいた推定。
スポンサー¶
意見¶
「[...] 最近、私は FastAPI をたくさん使っています。[...] 実際、Microsoft のすべてのチームの ML サービスにそれを使用する予定です。そのうちのいくつかは、コア Windows 製品や一部の Office 製品に統合されています。」
「FastAPI ライブラリを採用して、予測を取得するためにクエリできる REST サーバーを起動しました。[Ludwig のために]」
「Netflix は、危機管理オーケストレーションフレームワークである Dispatch のオープンソースリリースを発表できることを嬉しく思います![FastAPI で構築]」
「FastAPI には非常に興奮しています。とても楽しいです!」
「正直なところ、あなたが作ったものは非常に堅牢で洗練されています。多くの点で、私が Hug に期待していたものです。誰かがそれを構築するのを見るのは本当に刺激的です。」
「REST API を構築するための モダンなフレームワーク を学びたいのであれば、FastAPI をチェックしてみてください。[...] 高速で、使いやすく、学習しやすいです [...]」
「私たちは API に FastAPI に切り替えました [...] きっと気に入るはずです [...]」
「本番環境の Python API を構築しようとしている人には、FastAPI を強くお勧めします。美しく設計され、使いやすく、高いスケーラビリティを備えています。これは当社の API ファースト開発戦略の重要なコンポーネントとなり、仮想 TAC エンジニアのような多くの自動化とサービスを推進しています。」
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 が提供) が表示されます。
代替 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 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 が使用
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 ライセンスの条件に基づいてライセンスされています。