2024-10-01 2025-05-10

目次

概要

以下、公式より引用 ( https://fastapi.tiangolo.com/ja/ )

高速: NodeJS や Go 並みのとても高いパフォーマンス (Starlette と Pydantic のおかげです)。 最も高速な Python フレームワークの一つです。
高速なコーディング: 開発速度を約 200%~300%向上させます。

「NodeJS や Go 並みのとても高いパフォーマンス」というのは本当か。
個人的には、ルーティングに関しては、そこそこのパフォーマンスは出せるかもしれないが、
ビジネスロジックをゴリゴリ書く場合、限界があるのではないかと推測。(検証が必要)

インストール

pip install fastapi

本番環境ではASGI サーバーが必要(以下では Uvicorn を使用)

pip install "uvicorn[standard]"

サンプル

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}

起動

uvicorn main:app --reload

尚、以下のURLでAPIドキュメントを表示可能。
http://127.0.0.1:8000/docs ( Swagger UI )
http://127.0.0.1:8000/redoc ( ReDoc )

ルーティング等

例)

from fastapi import FastAPI
from fastapi.responses import JSONResponse
from pydantic import BaseModel, Field

app = FastAPI()


# 動作確認用
class DataHolder:
    items = [ 
        {"item_id": "item01", "item_name": "アイテム01", "description": "説明01"},
        {"item_id": "item02", "item_name": "アイテム02", "description": "説明02"},
        {"item_id": "item03", "item_name": "アイテム03", "description": "説明03"},
    ]


class Item(BaseModel):
    item_id: str 
    item_name: str 
    description: str | None = None


@app.get("/")
def root():
    return {"message": "this is root"}


@app.get("/items")
def read_items(item_name: str = None):    # メソッド引数でクエリ文字列の取得が可能
    if item_name:
        return [i for i in items if i["item_name"] == item_name]
    return DataHolder.items


@app.get("/items/{item_id}")              # PATHパラメータは {項目名} で取得可能
def read_item(item_id):
    matched = [i for i in DataHolder.items if i["item_id"] == item_id]
    if matched:
        return matched[0]
    return JSONResponse(status_code=404, content={"message": "該当データなし"})


@app.post("/items", status_code=201)      # デフォルトのステータス宣言
def new_item(new_item: Item):             # BaseModelを継承したclassで入力データの取得が可能
    if len([i for i in DataHolder.items if i["item_id"] == new_item.item_id]) > 0:
        return JSONResponse(status_code=400, content={"message": "既に登録されています"})  # 任意のステータスを返却する場合
    DataHolder.items.append(new_item.dict())
    return new_item


@app.put("/items/{item_id}")
def update_item(item_id: str, item: Item):
    if len([i for i in DataHolder.items if i["item_id"] == item_id]) == 0:
        return JSONResponse(status_code=404, content={"message": "該当データなし"})
    upd_item = { "item_id": item_id, "item_name": item.item_name, "description": item.description }
    DataHolder.items = [upd_item if i["item_id"] == item_id else i for i in DataHolder.items]
    return {"message": "updated"}


@app.delete("/items/{item_id}")
def delete_item(item_id: str):
    if len([i for i in DataHolder.items if i["item_id"] == item_id]) == 0:
        return JSONResponse(status_code=404, content={"message": "該当データなし"})
    DataHolder.items = [i for i in DataHolder.items if i["item_id"] != item_id]
    return {"message": "deleted"}

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS