FastAPI基本解説

1. WebAPIとは?

2. WebAPIを使う理由

3. FastAPIの基本

環境準備

pip install fastapi
pip install "uvicorn[standard]" # ASGI対応サーバー

基本的なAPI作成

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return {"message": "Hello API"}

APIサーバーの起動

uvicorn main:app --reload

リクエスト送信(クライアント側)

import requests

response = requests.get("http://127.0.0.1:8000/")
print(response.status_code) # 200
print(response.text) # {"message":"Hello API"}

4. パスパラメーター

URLのパスの一部を変数として使用

@app.get("/items/{item_id}")
def read_item(item_id):
    return {"item_id": item_id, "item_name": "Tシャツ"}

クライアント側

response = requests.get("http://127.0.0.1:8000/items/111")
# {"item_id":"111","item_name":"Tシャツ"}

注意点

5. クエリパラメーター

URL末尾の ?param1=value1¶m2=value2 の形式

@app.get("/items")
def read_items(skip: int = 0, limit: int = 10):
    return {"items": items[skip:skip+limit]}

クライアント側

response = requests.get("http://127.0.0.1:8000/items?skip=1&limit=2")

値の検証

from typing import Annotated
from fastapi import Query

@app.get("/items")
def read_items(limit: Annotated[int, Query(ge=1, le=10)] = 10):

6. リクエストボディ

POST/PUTリクエストでデータを送信

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    description: Union[str, None] = None

@app.post("/items")
def create_item(item: Item):
    print(f"Received item: {item}")
    return item

クライアント側

response = requests.post(
    "http://127.0.0.1:8000/items",
    json={"name": "Tシャツ", "price": 2000, "description": "白Tシャツ"}
)

7. ヘッダー

HTTPリクエスト/レスポンスの付加情報

from fastapi import Header

@app.get("/sample")
def read_sample(authorization: Union[str, None] = Header(default=None)):
    print(f"Authorization: {authorization}")
    return {"message": "Sample response"}

クライアント側

response = requests.get(
    "http://127.0.0.1:8000/sample",
    headers={"Authorization": "Bearer token123"}
)

レスポンスヘッダー設定

from fastapi import Response

@app.get("/sample")
def read_sample(response: Response):
    response.headers["Custom-Header"] = "12345"
    return {"message": "With custom header"}

8. 非同期処理

処理を待たずに次の処理を実行

import asyncio

@app.get("/sleep/{seconds}")
async def sleep_time(seconds: int):
    await asyncio.sleep(seconds)
    return {"seconds": seconds}

非同期クライアント

import asyncio
import time

async def main():
    start = time.time()
    tasks = [
        sleep_time(1),
        sleep_time(2)
    ]
    results = await asyncio.gather(*tasks)
    end = time.time()
    print(f"Duration: {end-start}") # 約2秒(並列実行)

9. FastAPIの便利機能

要約

FastAPIはPythonで簡単にWebAPIを作れるフレームワークで、HTTPリクエストメソッド(GET/POST/PUT/DELETE)に対応したエンドポイントを短いコードで実装できる。パスパラメーター、クエリパラメーター、リクエストボディ、ヘッダーなど様々なデータ受け渡し方法をサポートし、Pydanticモデルによるデータ検証機能も備える。自動ドキュメント生成や非同期処理対応など開発効率を高める機能が充実しており、Pythonの型アノテーションを活用した直感的なコーディングが可能。複数のシステム間でのデータ連携やフロントエンドとバックエンドの分離など、現代的なWeb開発に最適なツールである。

関連記事