FastAPI¶
FastAPI framework, high performance, easy to learn, fast to code, ready for production
ドキュメント: https://fastapi.tiangolo.com
ソースコード: https://github.com/fastapi/fastapi
FastAPI は、Pythonの標準である型ヒントに基づいてPython 以降でAPI を構築するための、モダンで、高速(高パフォーマンス)な、Web フレームワークです。
主な特徴:
-
高速: NodeJS や Go 並みのとても高いパフォーマンス (Starlette と Pydantic のおかげです)。 最も高速な Python フレームワークの一つです.
-
高速なコーディング: 開発速度を約 200%~300%向上させます。 *
- 少ないバグ: 開発者起因のヒューマンエラーを約 40%削減します。 *
- 直感的: 素晴らしいエディタのサポートや オートコンプリート。 デバッグ時間を削減します。
- 簡単: 簡単に利用、習得できるようにデザインされています。ドキュメントを読む時間を削減します。
- 短い: コードの重複を最小限にしています。各パラメータからの複数の機能。少ないバグ。
- 堅牢性: 自動対話ドキュメントを使用して、本番環境で使用できるコードを取得します。
- Standards-based: API のオープンスタンダードに基づいており、完全に互換性があります: OpenAPI (以前は Swagger として知られていました) や JSON スキーマ.
* 本番アプリケーションを構築している開発チームのテストによる見積もり。
Sponsors¶
評価¶
"[...] 最近 FastAPI を使っています。 [...] 実際に私のチームの全ての Microsoft の機械学習サービス で使用する予定です。 そのうちのいくつかのコアな**Windows**製品と**Office**製品に統合されつつあります。"
"FastAPIライブラリを採用し、クエリで**予測値**を取得できる**REST**サーバを構築しました。 [for Ludwig]"
"Netflix は、危機管理**オーケストレーションフレームワーク、**Dispatch**のオープンソースリリースを発表できることをうれしく思います。 [built with **FastAPI]"
"私は**FastAPI**にワクワクしています。 めちゃくちゃ楽しいです!"
"正直、超堅実で洗練されているように見えます。いろんな意味で、それは私がハグしたかったものです。"
"REST API を構築するための**モダンなフレームワーク**を学びたい方は、FastAPI [...] をチェックしてみてください。 [...] 高速で, 使用、習得が簡単です。[...]"
"私たちの**API**は**FastAPI**に切り替えました。[...] きっと気に入ると思います。 [...]"
Typer, the FastAPI of CLIs¶
もし Web API の代わりにターミナルで使用するCLIアプリを構築する場合は、Typerを確認してください。
**Typer**は FastAPI の弟分です。そして、**CLI 版 の FastAPI**を意味しています。
必要条件¶
FastAPI は巨人の肩の上に立っています。
インストール¶
$ pip install fastapi
---> 100%
本番環境では、Uvicorn または、 Hypercornのような、 ASGI サーバーが必要になります。
$ pip install "uvicorn[standard]"
---> 100%
アプリケーション例¶
アプリケーションの作成¶
main.py
を作成し、以下のコードを入力します:
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: str = None):
return {"item_id": item_id, "q": q}
またはasync def
を使います...
async
/ await
を使用するときは、 async def
を使います:
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: str = None):
return {"item_id": item_id, "q": q}
注:
わからない場合は、ドキュメントのasync
と await
にある"In a hurry?"セクションをチェックしてください。
実行¶
以下のコマンドでサーバーを起動します:
$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
uvicorn main:app --reload
コマンドについて
uvicorn main:app
コマンドは以下の項目を参照します:
main
:main.py
ファイル (Python "モジュール")app
:main.py
のapp = FastAPI()
の行で生成されたオブジェクト--reload
: コードを変更したらサーバーを再起動します。このオプションは開発環境でのみ使用します
動作確認¶
ブラウザから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}
パスのパスパラメータitem_id
はint
でなければなりません。- パス
/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が提供しています。):
アップグレード例¶
PUT
リクエストからボディを受け取るためにmain.py
を修正しましょう。
Pydantic によって、Python の標準的な型を使ってボディを宣言します。
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = 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}
サーバーは自動でリロードされます。(上述のuvicorn
コマンドで--reload
オプションを追加しているからです。)
自動対話型の API ドキュメントのアップグレード¶
http://127.0.0.1:8000/docsにアクセスしましょう。
- 自動対話型の API ドキュメントが新しいボディも含めて自動でアップデートされます:
- "Try it out"ボタンをクリックしてください。パラメータを入力して API と直接やりとりすることができます:
- それから、"Execute" ボタンをクリックしてください。 ユーザーインターフェースは API と通信し、パラメータを送信し、結果を取得して画面に表示します:
代替の API ドキュメントのアップグレード¶
http://127.0.0.1:8000/redocにアクセスしましょう。
- 代替の API ドキュメントにも新しいクエリパラメータやボディが反映されます。
まとめ¶
要約すると、関数のパラメータとして、パラメータやボディ などの型を**一度だけ**宣言します。
標準的な最新の Python の型を使っています。
新しい構文や特定のライブラリのメソッドやクラスなどを覚える必要はありません。
単なる標準的な**3.8 以降の Python**です。
例えば、int
の場合:
item_id: int
または、より複雑なItem
モデルの場合:
item: Item
...そして、この一度の宣言で、以下のようになります:
- 以下を含むエディタサポート:
- 補完
- タイプチェック
- データの検証:
- データが無効な場合に自動でエラーをクリアします。
- 深い入れ子になった JSON オブジェクトでも検証が可能です。
- 入力データの変換: ネットワークから Python のデータや型に変換してから読み取ります:
- JSON.
- パスパラメータ
- クエリパラメータ
- クッキー
- ヘッダー
- フォーム
- ファイル
- 出力データの変換: Python のデータや型からネットワークデータへ変換します (JSON として):
- Convert Python types (
str
,int
,float
,bool
,list
, etc). datetime
オブジェクトUUID
オブジェクト- データベースモデル
- ...などなど
- 2 つの代替ユーザーインターフェースを含む自動インタラクティブ API ドキュメント:
- Swagger UI.
- ReDoc.
コード例に戻りましょう、FastAPI は次のようになります:
GET
およびPUT
リクエストのパスにitem_id
があることを検証します。item_id
がGET
およびPUT
リクエストに対してint
型であることを検証します。- そうでない場合は、クライアントは有用で明確なエラーが表示されます。
GET
リクエストに対してオプションのクエリパラメータq
(http://127.0.0.1:8000/items/foo?q=somequery
のように) が存在するかどうかを調べます。- パラメータ
q
は= None
で宣言されているので、オプションです。 None
がなければ必須になります(PUT
の場合のボディと同様です)。PUT
リクエストを/items/{item_id}
に送信する場合は、ボディを JSON として読み込みます:- 必須の属性
name
を確認してください。 それはstr
であるべきです。 - 必須の属性
price
を確認してください。それはfloat
でなければならないです。 - オプションの属性
is_offer
を確認してください。値がある場合は、bool
であるべきです。 - これらはすべて、深くネストされた JSON オブジェクトに対しても動作します。
- 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 トークン**を用いた **OAuth2 や HTTP Basic 認証 のサポートを含む、セキュリティと認証。
- **深くネストされた JSON モデル**を宣言するためのより高度な(しかし同様に簡単な)技術(Pydantic のおかげです)。
- 以下のようなたくさんのおまけ機能(Starlette のおかげです):
- WebSockets
- GraphQL
httpx
やpytest
をもとにした極限に簡単なテスト- CORS
- クッキーセッション
- ...などなど。
パフォーマンス¶
独立した TechEmpower のベンチマークでは、Uvicorn で動作する**FastAPI**アプリケーションが、Python フレームワークの中で最も高速なものの 1 つであり、Starlette と Uvicorn(FastAPI で内部的に使用されています)にのみ下回っていると示されています。
詳細はベンチマークセクションをご覧ください。
オプションの依存関係¶
Pydantic によって使用されるもの:
email-validator
- E メールの検証
Starlette によって使用されるもの:
httpx
-TestClient
を使用するために必要です。jinja2
- デフォルトのテンプレート設定を使用する場合は必要です。python-multipart
- "parsing"request.form()
からの変換をサポートしたい場合は必要です。itsdangerous
-SessionMiddleware
サポートのためには必要です。pyyaml
- Starlette のSchemaGenerator
サポートのために必要です。 (FastAPI では必要ないでしょう。)graphene
-GraphQLApp
サポートのためには必要です。
FastAPI / Starlette に使用されるもの:
uvicorn
- アプリケーションをロードしてサーブするサーバーのため。orjson
-ORJSONResponse
を使用したい場合は必要です。ujson
-UJSONResponse
を使用する場合は必須です。
これらは全て pip install fastapi[all]
でインストールできます。
ライセンス¶
このプロジェクトは MIT ライセンスです。