FastAPIでリクエストを処理する方法

概要

FastAPIでは、リクエストの処理はエンドポイント関数内で行います。
エンドポイント関数の引数には、Pydanticモデルによるリクエストボディやパスパラメータが渡されます。 これらを使用して、リクエストに関連するデータの取得やレスポンスの生成などを行います。

ここでは、以下バージョンを使用した、FastAPIでリクエスト処理する方法を説明します。

FastAPI v0.100.0
Python v3.11.4
uvicorn v0.22.0

また、今回作成するコードは全て、GitHub に掲載しています。

リクエスト情報を取得する方法

リクエストに関する情報を取得するには、Pydanticモデルと依存性インジェクションを使用します。 FastAPIのエンドポイント関数で使用され、リクエストヘッダー、パラメータ、ボディなどのデータにアクセスするために利用されます。

以下のサンプルコードは、FastAPIでリクエストオブジェクトを理解するための例です。GETリクエストを受け取り、リクエストヘッダー、クエリパラメータ、ボディデータにアクセスして、それらの値を含むレスポンスを返します。

main.py

from fastapi import FastAPI, Header, Depends, Body
from typing import Optional
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

@app.post("/items/")
async def create_item(item: Item, user_agent: Optional[str] = Header(None)):
    item_dict = item.dict()
    item_dict.update({"user_agent": user_agent})
    return item_dict

解説

  • 必要なライブラリとモジュールのインポート:
from fastapi import FastAPI, Header, Depends, Body
from typing import Optional
from pydantic import BaseModel

FastAPIは、APIを作成するための主要なクラスです。Headerはリクエストヘッダーから情報を取得するための関数、Dependsは依存関係を管理するための関数、Bodyはリクエストボディから情報を取得するための関数です。Optionalは型ヒントの一部で、ある値が省略可能であること(Noneを取りうること)を示します。BaseModelはPydanticライブラリの一部で、入力データの検証、シリアライゼーション、ドキュメンテーション生成を行います。

  • FastAPIアプリケーションのインスタンス化:
app = FastAPI()

appは、このFastAPIアプリケーションの新しいインスタンスを作成します。これはアプリケーションの主要なエントリーポイントで、ルーティング定義などの設定を行います。

  • Itemモデルの定義:
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

ItemクラスはPydanticのBaseModelを継承します。これにより、データ検証とシリアライゼーションの機能が利用できます。ここでnamedescriptionpricetaxという4つのフィールドを定義しています。

  • ルーティングとエンドポイントの定義:

以下の例では、新しいアイテムを作成するエンドポイントを定義しています。

@app.post("/items/")
async def create_item(item: Item, user_agent: Optional[str] = Header(None)):
    item_dict = item.dict()
    item_dict.update({"user_agent": user_agent})
    return item_dict

このエンドポイントはFastAPIのデコレータ機能を使用して定義され、HTTPメソッド(post)とURLパス(/items/)を指定します。また、エンドポイントの関数には非同期処理を可能にするasyncキーワードが付けられています。

エンドポイントの関数は2つのパラメータを受け取ります。1つ目のitem: ItemはリクエストボディからItemモデルに基づいたデータを取得し、2つ目のuser_agent: Optional[str] = Header(None)はリクエストヘッダーからユーザーエージェントの情報を取得します。

関数内では、まずitemを辞書に変換し、その後user_agentの情報を追加しています。最後に、更新された辞書をレスポンスとして返しています。

テスト

curl -X POST -H "Content-Type: application/json" -d '{"name": "item1", "price": 10.0}' http://localhost:8000/items/

まとめ

本記事では、FastAPIでリクエストの処理方法を詳しく紹介しました。エンドポイント関数の引数にPydanticモデルを使用し、リクエストボディやパスパラメータを扱う方法について説明しました。また、依存性インジェクションを利用してリクエストヘッダー、パラメータ、ボディなどのデータにアクセスする方法も示しました。

具体的には、FastAPIアプリケーションを作成し、その中でItemという名前のPydanticモデルを定義しました。そして、POSTリクエストを受け取るエンドポイントを作成し、そのエンドポイント内でリクエストボディからItemモデルのデータとリクエストヘッダーからユーザーエージェントの情報を取得しました。この情報を元にレスポンスを生成するサンプルコードを提供しました。

FastAPIは、このような高度な機能を提供する一方で、非常に直感的で使いやすいフレームワークであることがわかります。今回の記事を通じて、FastAPIを用いたリクエスト処理の基本を理解し、具体的な実装方法を学べたことでしょう。