Skip to the content.

ディレクトリ構成

ここでは、FastAPI が配布しているテンプレートフルスタック FastAPI PostgreSQLのディレクトリ構成を参考にし、ディレクトリを作成していきます。

目次

ディレクトリ作成

appディレクトリ配下にapicorecruddbmodelsschemasディレクトリを作成します。さらにapiディレクトリ配下にendpointsディレクトリを作成してください。ディレクトリ構成は、以下のようになります。

app
├ api
│  └ endpoints
├ core
├ crud
├ db
├ models
├ schemas
├ __init__.py
└ main.py

また、各ディレクトリに__init__.pyを作成してください。中身が空で大丈夫です。

app
├ api
│  ├ endpoints
│  │  └ __init__.py
│  └ __init__.py
├ core
│  └ __init__.py
├ crud
│  └ __init__.py
├ db
│  └ __init__.py
├ models
│  └ __init__.py
├ schemas
│  └ __init__.py
├ __init__.py
└ main.py

各ディレクトリについて(スキップ可)

各ディレクトリの役割について記述します。

api

FastAPI のパスオペレーション関数を定義します。

core

config.pysecurity.pyを作成します。config.pyには DB の URI や、暗号化に使う KEY など設定値を記述します。security.pyには、パスワードのハッシュ化や Json Web Token の発行を行う関数を定義します。

crud

SQLAlchemy の CRUD 操作について記述します。

db

base.pysession.pyを作成します。base.pyには、SQLAlchmey のモデルベースクラス(Base)を定義します。ここで定義した Base を継承して ORM を扱えるモデルクラスを定義します。session.pyには、DB エンジンとセッションを作るクラスを sessionmaker で作ります。

models

db/base.pyで定義した Base を継承して SQLAlchemy のモデルクラスを定義します。

schemas

FastAPI で利用する API のリクエストとレスポンスの型を定義します。

Chapter1 のリファクタリング

Chapter1 に記述したコードをこのディレクトリ構成に合うようにリファクタリングしていきます。

router を使ったファイル分け

Chapter1 でmain.pyに記述したパスオペレーション関数は、app/api/endpoints配下にファイルを作成し、定義していきます。Chapter1 では、app = FastAPI()としappにパスオペレーション関数を追加していきましたが、ファイルを分ける場合は、APIRouterを使います。

app/api/endpoints配下に以下のファイルを記述しましょう。 app/api/endpoints/root.py

from fastapi import APIRouter

router = APIRouter()


@router.get("/")
def root():
    return {"API": "Active"}

今後、ここにエンドポイントの種類ごとにファイルを追加していきます。そこで定義した router を 1 つにまとめる記述をapp/api/api.pyにします。以下のようなファイルを作成しましょう。

app/api/api.py

from fastapi import APIRouter

from app.api.endpoints import root

api_router = APIRouter()
api_router.include_router(root.router, tags=["test"])

Chapter1 で作成したapp/main.pyは、app/api/api.pyで 1 つにまとめられた router をapp = FastAPI()に加えます。以下のように変更します。

app/main.py

from fastapi import FastAPI

from app.api.api import api_router

app = FastAPI()

app.include_router(api_router)

動作確認

chapter1 と同じようにappディレクトリがあるディレクトリで、以下のコマンドを実行し、サーバーを起動します。

uvicorn app.main:app --reload --port 8000

ブラウザでhttp://127.0.0.1:8000を開きます。次のような JSON レスポンスが表示されれば、リファクタリング完了です。

{ "API": "Active" }

Chapter1 と同じようにSwagger UIを開いてみましょう。

SwaggerUI

Chapter1 とほぼ同じ画面が表示されているかと思いますが、1 箇所defaultからtestに変わったところがあると思います。これは、app/api/api.pyで定義したapi_router.include_routerの引数のtags=["test"]によって設定されています。機能ごとに tags を設定するとこのようにドキュメントも整理されるので、tags は書くようにしましょう。

Next: Chapter3 エンドポイントの作成

Prev: Chapter1 FastAPI はじめのステップ