FastAPIとは
FastAPIは、Python 3.6以上で使用される最新の高性能Webフレームワークで、API(Application Programming Interfaces)を構築するために使用されます。FastAPIは、WebルーティングにはStarletteを、データのバリデーションと設定管理にはPydanticを使用して構築されています。これらの依存関係により、FastAPIは高速性と信頼性が確保され、現代のWeb開発において優れた選択肢となっています。
FastAPIは、2018年12月に初めて一般に公開されました。それ以来、その速度、使いやすさ、包括的な機能セットにより、大きな人気を集めています。
FastAPIの主な機能
FastAPIのもっとも注目すべき特徴の1つは、その速度です。他の人気のあるPythonフレームワークと比較して、FastAPIはパフォーマンスと開発の速さの両方で優れたパフォーマンスを発揮します。FastAPIは、現在利用可能な最速のPythonフレームワークの1つであり、Node.jsやGoにわずかに劣る程度です。
FastAPIはPythonの型ヒント機能を中心に設計されています。型ヒントは、関数の引数や戻り値の予想される型を開発者が示すことができるPythonの機能です。FastAPIはこれらの型ヒントを使用してデータのバリデーション、シリアライズ、ドキュメント化を処理し、バグが少なく、よりクリーンなコードを実現します。
FastAPIは、自動的な対話型APIドキュメントでも知られています。FastAPIで新しいAPIエンドポイントを作成すると、フレームワークはSwagger UIまたはReDocを使用してそのエンドポイント用の対話型ドキュメントページを自動生成します。この機能により、開発者やユーザーはAPIとやり取りし、その機能を理解し、さまざまなパラメータをテストして応答を確認することができます。全てをWebブラウザから行うことができます。
FastAPIのもう1つの注目すべき特徴は、非同期リクエスト処理の堅牢なサポートです。非同期WebフレームワークであるStarletteを基に構築されたFastAPIは、Pythonのネイティブなasyncとawaitキーワードをサポートしており、IOバウンドの操作を効率的に処理するために非同期コードを記述することができます。
FastAPIはまた、OAuth2認証、JSON Web Token、クエリパラメータ、リクエストボディ、パスパラメータ、クッキー、ヘッダー、その他のHTTP機能のサポートも提供しており、堅牢で安全なWeb APIを構築するための包括的なツールです。
インストール
FastAPIはPython Package Index(PyPI)でパッケージとして利用可能であり、pipを使用してインストールすることができます。
$ pip install fastapi
FastAPIを実行するには、ASGI(Web Server Gateway Interface)サーバーが必要です。UvicornはASGIサーバーの1つであり、uvloopとhttptoolsを使用した高速なASGIサーバーの実装です。
$ pip install uvicorn
FastAPIアプリケーションの作成
ルートの定義
FastAPIでは、ルートはアプリケーション内のエンドポイントを定義する方法です。エンドポイントはAPIにアクセスできる特定のURLです。FastAPIでは、Pythonの関数、または「パスオペレーション」とも呼ばれるものを使用してルートを定義します。
まず、単一のルートを持つシンプルなFastAPIアプリケーションを作成します。お好きなコードエディタを開き、main.py
という新しいPythonファイルを作成し、次のコードを記述します。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
上記のコードでは、まずFastAPI
クラスをインポートします。次に、このクラスのインスタンスを作成し、変数app
に割り当てます。このインスタンスはAPIとの主要なやり取りポイントとなります。
次に、@app.get("/")
デコレータを使用してルートを定義します。このデコレータは、下にある関数がGETリクエストがルート("/"
)URLに対して行われた場合に呼び出されることをFastAPIに伝えます。read_root()
関数は単純にJSONレスポンスを返します({"Hello": "World"}
)。
アプリケーションの実行
最初のルートが定義されたので、FastAPIアプリケーションを実行することができます。これを行うには、ターミナルまたはコマンドプロンプトを開き、main.py
ファイルが含まれるディレクトリに移動し、次のコマンドを入力します。
$ uvicorn main:app --reload
ここで、main:app
はUvicornに、main.py
ファイル内のapp
という名前のアプリケーションインスタンスを探すよう指示します。--reload
フラグはホットリローディングを有効にし、コードを変更するたびにサーバーが自動的に更新されることを意味します。
Uvicornが実行されると、Webブラウザを開き、http://localhost:8000/
にアクセスします。そこに{"Hello": "World"}
というテキストのJSONレスポンスが表示されるはずです。
FastAPIのデータ処理
この章では、FastAPIがリクエストボディ、クエリパラメータ、およびパスパラメータの形式でデータをどのように処理するかについて詳しく見ていきます。
リクエストボディ
FastAPIでは、HTTPメソッド(POSTやPUTなど)のリクエストボディをPydanticモデルを使用して読み取ることができます。Pydanticモデルを使用すると、データ構造を定義し、バリデーション、シリアライズ、ドキュメント化を自動的に処理することができます。
例を見てみます。まず、Pydanticモデルを定義します。
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
quantity: int
ここでは、name
、price
、quantity
は必須フィールドであり、description
はオプションです。
次に、このモデルをルートで使用します。
@app.post("/items/")
def create_item(item: Item):
return item
このルートでは、FastAPIはリクエストボディでItem
モデルと同じ構造のJSONオブジェクトを期待します。FastAPIはデータを自動的にバリデーションし、Pydanticモデルにシリアライズし、ルート関数に含めます。
クライアントは、curl
コマンドを使用してJSONオブジェクトをリクエストボディとしてこのルートに対してPOSTリクエストを送信することができます。以下はcurl
コマンドを使用した例です。
$ curl -X POST "http://localhost:8000/items/" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"name\":\"Foo\",\"price\":50.5,\"quantity\":10}"
クエリパラメータ
クエリパラメータはURLの?
以降に記述され、通常はコンテンツのソートやフィルタリングに使用されます。FastAPIはクエリパラメータの処理を非常に簡単にします。
クエリパラメータを受け入れるルートを追加してみます。
@app.get("/items/")
def read_items(skip: int = 0, limit: int = 10):
return items[skip : skip + limit]
この例では、skip
とlimit
はオプションのクエリパラメータで、デフォルト値はそれぞれ0
と10
です。
クライアントは、URLのクエリパラメータを含むGETリクエストをこのルートに送信することができます。以下はcurl
コマンドを使用した例です。
$ curl -X GET "http://localhost:8000/items/?skip=20&limit=10" -H "accept: application/json"
パスパラメータ
パスパラメータ(またはパス変数)は、URLパスの一部である変数です。関数の引数として定義することができます。
FastAPIでパスパラメータを使用する方法を見てみます。
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
このルートでは、item_id
はパスパラメータであり、FastAPIはURLから抽出し、ルート関数に引数として渡します。
クライアントは、GETリクエストをこのルートに対して送信し、URLパスにアイテムIDを含めることができます。以下はcurl
コマンドを使用した例です。
$ curl -X GET "http://localhost:8000/items/5" -H "accept: application/json"
参考