FastAPIプロジェクトのコンフィグファイルを作成する
概要
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を作成します。
from fastapi import FastAPI
app = FastAPI()
APIのテストを作成
APIのテストを作成します。
FastAPIのテストクライアント を使用します。
https://fastapi.tiangolo.com/ja/tutorial/testing/
必要なパッケージをインストールします。
pipenv install fastapi 'uvicorn[standard]'
テストを作成します。
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) を追加します。
from fastapi import FastAPI
app = FastAPI()
+ @app.get("/message")
+ def message():
+ return {"msg": "Hello FastAPI"}
テストの再実施
エラーになっていたテストを再度実行し、意図した実装ができているか確認します。
pipenv run pytest app/tests/test_main.py
今度はエラーが解消されていると思います。
コンフィグファイルの作成
プロジェクトで使用するコンフィグファイルを作成します。
from pydantic import BaseSettings
class Settings(BaseSettings):
MESSAGE: str = "Hello FastAPI"
settings = Settings()
コンフィグの適用
作成したコンフィグを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}"}
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