Chapter 07

アプリケーションの概要とディレクトリ

smithonisan
smithonisan
2021.08.23に更新

作成するTODOアプリの概要と、FastAPIのディレクトリ構成について学びます。

TODOアプリの概要

本書で作成していくのは簡単なTODOアプリです。すなわち、

⭐明日の予定⭐

  • 資源ごみを出す
  • 醤油を買う
  • クリーニングを取りに行く

このようなアプリです。

REST API

REST APIでは、HTTPでやり取りする際に、URLですべての「リソース」を定義します。あるリソースを表すエンドポイントと、HTTPメソッド(GET/POST/PUT/DELETE など)を組み合わせてAPI全体を構成していきます。

RESTの思想や厳密な定義は、他に良書やインターネット上にもわかりやすい説明がたくさんありますので本書では扱いません。現時点で詳しく理解しなくても、実装を進めるとともに感覚的に理解していけるでしょう。

RESTに従って、上記のTODOアプリを実現するのに必要な機能を整理してみます。

  • TODOリストを表示する
  • TODOにタスクを追加する
  • TODOのタスクの説明文を変更する
  • TODOのタスク自体を削除する
  • TODOタスクに「完了」フラグを立てる
  • TODOタスクから「完了」フラグを外す

他にも、日付順にソートしたり、手動で順番を入れ替える、入れ子でTODOタスクを定義できるようにする、などさまざまな機能を追加することで、高機能なアプリを作ることができます。ここでは、上記の基本的な機能を作成することとしましょう。

これらの機能は、REST APIでは、

  • HTTPメソッド エンドポイント{}内はパラメータ)

の形式で書くと、以下のように定義することができます。

  • GET /tasks
  • POST /tasks
  • PUT /tasks/{task_id}
  • DELETE /tasks/{task_id}
  • PUT /tasks/{task_id}/done
  • DELETE /tasks/{task_id}/done

もちろん、これが唯一の正解というわけではなく、 PATCH を使ったり、「完了」フラグをトグルにしたり、UIの仕様やDBの仕様に応じて異なるインターフェースとして定義することもあります。

ディレクトリ構造について

FastAPIでは、ディレクトリ構造やファイルの分割の仕方は厳密には決められていません。FastAPIの 公式ドキュメント でもおすすめのディレクトリ構造は記されていますが、プロジェクトが大きくなってから変更する場合は、大規模なリファクタリングを行うことになってしまいます。

本書では、あらかじめ比較的細かくディレクトリを分割することにします。これによって、アプリケーションがある程度の規模になっても耐えられるコードベースを持つ、実用的なAPIを目指します。

api
├── __init__.py
├── main.py
├── schemas
│   └── __init__.py
├── routers
│   └── __init__.py
├── models
│   └── __init__.py
└── cruds
    └── __init__.py

上記のように、 api ディレクトリの下に schemas, routers, models, cruds の4つのディレクトリを切りましょう。それぞれのディレクトリの役割については、次章以降で説明していきます。

また、 __init__.py は前章で説明したように、pythonモジュールであることを表す空ファイルです。