FastAPIを使用した実用的なテンプレートです。 DB(MySQL)とuvicornを含めてdocker化しています。 poetryを使用して、パッケージ管理およびタスクランナーを実装しています。
本リポジトリに、herokuにデプロイするための設定ファイルも含まれております。
デプロイ済の環境は以下から参照できます。
https://fastapi-sample-tk.herokuapp.com/docs
DB定義(dbdocs)
https://dbdocs.io/marutoraman/fastapi-sample?table=jobs&schema=public&view=table_structure
crud/base.py にCRUDの共通Classを記述しています。 それ以外のcrud配下のファイルで、CRUD処理をoverrideすることができます。
特定のUserのみが実行できるAPIを作成する場合は、 tableの user.scopes の値とrouterに指定したscopeを一致させる。
@router.get(
"/{id}",
response_model=schemas.UserResponse,
dependencies=[Security(get_current_user, scopes=["admin"])],
)
Pythonではスネークケースが標準ですが、Javascriptではキャメルケースが標準なため、単純にpydanticでschemaを作成しただけでは jsonレスポンスにスネークケースを使用せざるをえない問題があります。
そこで、humpsをinstallして、自動的にスネークケースに変換するように 以下のようなBaseSchemaを作成しています。 このBaseSchemaを継承することで、簡単にキャメルケースとスネークケースの相互変換が実現できます。
class BaseSchema(BaseModel):
class Config:
alias_generator = to_camel
allow_population_by_field_name = True
サブディレクトリ配下のpyファイルから、別ディレクトリのファイルをimportする場合は その前に以下のコードを記述する必要がある。
sys.path.append(str(Path(__file__).absolute().parent.parent))
batch/set_base_path.py に記述し、各ファイルの先頭でimportすることで より簡単にimportできるようにしています。
BaseSettingsを継承して共通設定Classを作成している。 .envファイルから自動的に設定を読み込む他、個別に設定を定義することもできる。
exceptions/error_messages.py にエラーメッセージを定義している。 APIExceptionと併せて以下のように、呼び出すことで、エラーレスポンスを作成できる。
raise APIException(ErrorMessage.ID_NOT_FOUND)
logger_config.yaml から設定を読み込む。
tests/ 配下に、テスト関連の処理を、まとめている。
テスト関数の実行毎にDBをクリーンするため、ステートレスなテストが実行できます。 tests/test_data/ 配下にテスト用データをセットする。
.envファイルにsentryのDNSを設定すると、error以上のloggingが発生した場合に sentryに自動的にloggingされます。
alembic/versions.py にマイグレーション情報を記述すると、DBマイグレーション(移行)を実施することができます。
poetryを使用して、パッケージ管理を実施。 また、poethepoetを使用するすることでタスクランナー機能を追加している。
push時に、Github Actionsを使用して、ECSに自動デプロイを行います。 以下にAWSの設定情報等をセットします。 .aws/ecs-task-definition.json .github/workflow/aws.yml
拡張機能「Remote Containers」をインストール
コマンドパレットを開き、「reopen container」と入力して実行
リモートエクスプローラー -> CONTAINERS -> {{ コンテナ名 }} -> Show Container Logs
ローカルで開発する場合
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
poetry install
docker-compose up --build
ローカル環境
http://localhost:8090/docs
Debugモード(F5押下)で起動した場合 ※Debugモードの場合は、ブレークポイントでローカル変数を確認できます。
http://localhost:8091/docs
※dockerコンテ内で開発する場合は、Dockerfileに組み込まれているため実行不要です
bashを使用している場合は、以下のコマンドを実行する。
これにより、タスクランナー実行時にタブで入力補完が可能になります。
poe _bash_completion >> ~/.bashrc
次回bash起動時に有効化されるが、即時有効化するためには以下を実行する。
. ~/.bashrc
```we
# デプロイ
heroku-cliを使用したherokuへのデプロイ方法を説明します。
## heroku-cliのインストール
以下を参考にインストール<br>
https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli
## appの作成
APPNAMEは任意の名称を指定(全ユーザーでユニークである必要があります)
heroku create APPNAME
## gitにherokuのリモートリポジトリをセット
heroku git:remote --app APPNAME
## push
git push heroku master
## heroku-cliにheroku-configをインストール
本リポジトリでは、.envファイル経由で設定を読み込んでいるため<br>
herokuでも.envファイルを有効にする必要があります。<br>
heroku plugins:install heroku-config
## .envファイルをpush
heroku config:push
## heroku再起動
heroku restart