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
を継承します。これにより、データ検証とシリアライゼーションの機能が利用できます。ここでname
、description
、price
、tax
という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を用いたリクエスト処理の基本を理解し、具体的な実装方法を学べたことでしょう。