【Python】FastAPIのディレクトリ構成

f:id:tm200:20210725133513p:plain

クラウドソーシングでFastAPIの実装を行う機会があったので、調べた事などをメモ。
作成したソースコードGit Hubに上げてあります。

ドキュメント

公式ドキュメントは分かりやすく書かれていた印象です。

fastapi.tiangolo.com

ディレクトリ構成

公式ドキュメントや現場のPJを参考に、以下の構成にしました。
※ Docker関連ファイルなどは除外してあります。

.
├── __init__.py
├── app.py
├── cli.py
├── database.py
├── db_config.py
├── dependencies
│   ├── __init__.py
│   ├── auth.py
│   └── request.py
├── exception.py
├── gunicorn_conf.py
├── handlers
│   ├── __init__.py
│   └── exception.py
├── midlewares
│   ├── __init__.py
│   └── timer.py
├── model
│   ├── __init__.py
│   └── users.py
├── plugins
│   └── __init__.py
├── requirements.txt
├── response.py
└──  routers
    ├── __init__.py
    ├── index.py
    └── users.py

app.py

create_appルーターやDB、ミドルウェア、エラーハンドリングの設定を行っています。
uvicorngunicornからこちらのモジュールを指定して起動します。

cli.py

開発時の動作確認用。
uvicorn.runで起動する他、ArgumentParserでホストとポートを指定可能です。
起動コマンドはpython cli.py

database.py

SQLiteMySQL単体テスト用のデータベース設定を定義しています。
ORMはsqlalchemy

exception.py

独自のExceptionクラスを定義しています。

response.py

JSONResponseを継承した、APIのレスポンスクラスを定義しています。
orjsonを組み込むだけならORJSONResponseクラスを直接利用すれば良いと思います。

gunicorn_conf.py

本番起動時のgunicornに関する設定を記載しています。
詳細は以下を参照してください。

docs.gunicorn.org

dependencies/*

fastapi.Dependsrouterモジュール内のエンドポイント定義関数の引数に設定するモジュール群です。
公式で言うと以下の辺りです。

fastapi.tiangolo.com

handlers/exception.py

handlers配下に定義したエラーハンドリング関数をapp.pyadd_exception_handlerする事により、エラーハンドリングを集約する事ができます。

midlewares/*

ミドルウェア用関数を定義しています。
app.pyadd_middlewareする事により使用可能となります。
各エンドポイントのレスポンス返却前に、何かしらの処理を追加できます。
公式に記載があるのですが、yieldを使った依存関係をもつ場合の終了コードはミドルウェアの後に実行されるようです。

fastapi.tiangolo.com

model/*

model配下にsqlalchemyのモデルクラスを定義します。

plugins/*

PJ独自のライブラリを使用した共通処理がある場合などで、実装モジュールを分けられる場合に使用します。

routers/*

fastapi.APIRouterで各エンドポイントを定義します。
app.pyでinclude時にsqlalchemy.orm.Sessionを注入してエンドポイントで利用できるようにしています。

まとめ

FastAPIを利用したい時にサッと引っ張ってこれる雛形が欲しいという事もあり、この記事の執筆に至りました。
おかしな点などありましたら、教えて頂けると嬉しいです😊

関係ないのですが、クラウドソーシングをしていると動けば良いというスタンスのコードをよく見かけるので、こういった記事が増える事により、〇〇コードが少しでも減ってくれれば良いなと思います。
(構成以前に謎文法な事も多いので、まずは公開されているpythonコードで自分が実装する分野と近しい実装を見て欲しいです、、、😂 )