😎

FastAPIでアプリを起動する

2024/11/18に公開

やること

FastAPIでアプリを起動してみる

前提

以前こんな記事を書きました。
https://zenn.dev/headwaters/articles/526d1a9588b754
その後アプリ開発から遠ざかっていたのですが、改めてバックエンドのキャッチアップをしていきたいということで、以前の記事で扱った書籍をFastAPIで実装していきたいと思います。
https://www.shoeisha.co.jp/book/detail/9784798175164

ディレクトリ構成

一旦のゴールはデータベースを利用したアプリを作るところなんですが、今回の記事で作るのは以下の部分になります。

fastapi/
  └── apps/
      ├── app.py  # メインのFastAPIアプリケーション
      ├── crud/
          ├── views.py  # CRUDエンドポイント
          ├── templates/
              └── crud/
                  └── index.html  # テンプレートファイル
          └── static/
              ├── style.css  # 静的ファイル

依存ライブラリ

pip install fastapi uvicorn

Flaskとの違い

実装面でFlaskと異なるのはエンドポイントを作成する部分になります。Flaskではアプリを分割するのにBlueprintを使いますが、FastAPIでは以下の流れとなります。
① APIRouterインスタンスを作成し、Jinja2テンプレートを設定する
② エンドポイントを作成し、テンプレートを返す
③ アプリにAPIRouterを登録する

①、②の流れを踏まえviews.pyは以下のようになります。

views.py
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

# APIRouterインスタンスを作成
router = APIRouter()

# Jinja2テンプレートを設定
templates = Jinja2Templates(directory="apps/crud/templates/crud")

# ルートを定義
@router.get("/", response_class=HTMLResponse)
async def index(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})

③にあるようにapp.pyにAPIRouterを登録します。

app.py
from fastapi import FastAPI
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from apps.crud.views import router as crud_router

# FastAPIアプリを作成するためのcreate_app関数
def create_app():
    # FastAPIインスタンスを生成
    app = FastAPI()

    # CRUDルーターを登録
    app.include_router(crud_router, prefix="/crud")

    # 静的ファイルをマウント
    app.mount("/static", StaticFiles(directory="apps/crud/static"), name="static")

    return app

app = create_app()

動作確認

以下のコマンドを実行します。

uvicorn apps.app:app --reload

Swagger UIでドキュメントを確認してみましょう。

コメントなど

とりあえずアプリを起動することができました!次はSQLAlchemyを使ってデータベースを操作していきたいと思います。

ヘッドウォータース

Discussion