⚙️

FastAPIプロジェクトのコンフィグファイルを作成する

2022/03/15に公開

概要

FastAPIプロジェクトのコンフィグファイルを作成し、アプリケーションに適用することを目指します。

この記事のゴール

http://localhost/message にAPI callを行い{"msg": "Hello FastAPI"}を受け取る
メッセージはコンフィグファイルで設定する

意識する点

API実装をテストを意識しながらやってみる
プロジェクトの構造を意識しながらファイルを作成してみる

使用するツール

pipenv で python 3.9の仮想環境を作成します。

pipenv --python 3.9

ディレクトリ構成

ディレクトリ構成はこちらを参考にしました
https://github.com/tiangolo/full-stack-fastapi-postgresql

tree
.
└── app
    ├── __init__.py
    ├── core
    │   ├── __init__.py
    │   └── config.py
    ├── main.py
    └── tests
        ├── __init__.py
        └── test_main.py

FastAPI アプリの main.py ファイルを作成

FastAPI アプリの main.pyを作成します。

app/main.py
from fastapi import FastAPI

app = FastAPI()

APIのテストを作成

APIのテストを作成します。

FastAPIのテストクライアント を使用します。
https://fastapi.tiangolo.com/ja/tutorial/testing/

必要なパッケージをインストールします。

pipenv install fastapi 'uvicorn[standard]'

テストを作成します。

app/tests/test_main.py
from fastapi.testclient import TestClient

from app.main import app

client = TestClient(app)


def test_read_main():
    """GET /message へのREST APIコールで、
        1. レスポンスコードが200であること
        2. {"msg": "Hello FastAPI"}が返却されること
    """
    response = client.get("/message")
    assert response.status_code == 200
    assert response.json() == {"msg": "Hello FastAPI"}

テストの実行

pipenv run pytest app/tests/test_main.py

まだREST APIを実装しておらず、APIコール先には何もいないのでエラーになります。

APIの作成

APIに (GET /message) を追加します。

app/main.py
from fastapi import FastAPI

app = FastAPI()


+ @app.get("/message")
+ def message():
+     return {"msg": "Hello FastAPI"}

テストの再実施

エラーになっていたテストを再度実行し、意図した実装ができているか確認します。

pipenv run pytest app/tests/test_main.py

今度はエラーが解消されていると思います。

コンフィグファイルの作成

プロジェクトで使用するコンフィグファイルを作成します。

core/config.py
from pydantic import BaseSettings


class Settings(BaseSettings):
    MESSAGE: str = "Hello FastAPI"


settings = Settings()

コンフィグの適用

作成したコンフィグをmain.pyとテストファイルに適用していきます。

app/main.py
from fastapi import FastAPI

+ from app.core.config import settings

app = FastAPI()


@app.get("/message")
def message():
-    return {"msg": "Hello FASTAPI"}
+    return {"msg": f"{settings.MESSAGE}"}
app/tests/test_main.py
from fastapi.testclient import TestClient

from app.main import app
+ from app.core.config import settings

client = TestClient(app)


def test_read_main():
    """GET /message へのREST APIコールで、
        1. レスポンスコードが200であること
        2. {"msg": "Hello FastAPI"}が返却されること
    """
    response = client.get("/message")
    assert response.status_code == 200
-    assert response.json() == {"msg": "Hello FastAPI"}
+    assert response.json() == {"msg": f"{settings.MESSAGE}"}

テストの再実施

テストを再度実行し、コンフィグが適用できているか確認します。

pipenv run pytest app/tests/test_main.py

エラーは出力されていないと思います。
テストが通ったのでアプリを実行します

pipenv run uvicorn app.main:app --reload

実際にAPI callを行ってみます。

curl http://localhost:8000/message
{"msg":"Hello FastAPI"}

{"msg":"Hello FastAPI"} が返却されたので実装は完了になります

Discussion