【Python】FastAPIのディレクトリ構成
クラウドソーシングでFastAPI
の実装を行う機会があったので、調べた事などをメモ。
作成したソースコードはGit Hubに上げてあります。
ドキュメント
公式ドキュメントは分かりやすく書かれていた印象です。
ディレクトリ構成
公式ドキュメントや現場の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、ミドルウェア、エラーハンドリングの設定を行っています。
uvicorn
やgunicorn
からこちらのモジュールを指定して起動します。
cli.py
開発時の動作確認用。
uvicorn.run
で起動する他、ArgumentParser
でホストとポートを指定可能です。
起動コマンドはpython cli.py
database.py
SQLite、MySQLと単体テスト用のデータベース設定を定義しています。
ORMはsqlalchemy
。
exception.py
独自のExceptionクラスを定義しています。
response.py
JSONResponse
を継承した、APIのレスポンスクラスを定義しています。
orjson
を組み込むだけならORJSONResponse
クラスを直接利用すれば良いと思います。
gunicorn_conf.py
本番起動時のgunicorn
に関する設定を記載しています。
詳細は以下を参照してください。
dependencies/*
fastapi.Depends
でrouter
モジュール内のエンドポイント定義関数の引数に設定するモジュール群です。
公式で言うと以下の辺りです。
handlers/exception.py
handlers
配下に定義したエラーハンドリング関数をapp.py
でadd_exception_handler
する事により、エラーハンドリングを集約する事ができます。
midlewares/*
ミドルウェア用関数を定義しています。
app.py
でadd_middleware
する事により使用可能となります。
各エンドポイントのレスポンス返却前に、何かしらの処理を追加できます。
公式に記載があるのですが、yield
を使った依存関係をもつ場合の終了コードはミドルウェアの後に実行されるようです。
model/*
model
配下にsqlalchemy
のモデルクラスを定義します。
plugins/*
PJ独自のライブラリを使用した共通処理がある場合などで、実装モジュールを分けられる場合に使用します。
routers/*
fastapi.APIRouter
で各エンドポイントを定義します。
app.py
でinclude時にsqlalchemy.orm.Session
を注入してエンドポイントで利用できるようにしています。
まとめ
FastAPI
を利用したい時にサッと引っ張ってこれる雛形が欲しいという事もあり、この記事の執筆に至りました。
おかしな点などありましたら、教えて頂けると嬉しいです😊
関係ないのですが、クラウドソーシングをしていると動けば良いというスタンスのコードをよく見かけるので、こういった記事が増える事により、〇〇コードが少しでも減ってくれれば良いなと思います。
(構成以前に謎文法な事も多いので、まずは公開されているpythonコードで自分が実装する分野と近しい実装を見て欲しいです、、、😂 )