FastAPIで.envに定義した変数を利用する
まずはTerminalなどで定義した環境変数を読み込む方法。
code:main.py
import os
name = os.getenv("MY_NAME", "World") # 第2引数はdefault
print(f"Hello {name} from Python")
プログラムの実行時に定義されている変数が参照される。
code:shell
python main.py # Hello World from Python
export MY_NAME = Wade Wilson"
python main.py # Hello Wade Wilson from Python
MY_NAME="Mayoumelon" main.py # Hello Mayoumelon from Python
プログラムごとに環境変数を指定することもできる。
code:shell
MY_NAME="Mayoumelon" main.py # Hello Mayoumelon from Python
上記の方法では環境から読み込んだ値はすべてstrとなる。
それ以外の型として読み込むにはコードで変換など行う必要がある。
code:config.py
from pydantic import BaseSettings
class Settings(BaseSettings):
app_name: str = "Awesome API"
admin_email: str
items_per_user: int = 50
settings = Settings()
mainでsettingsを読み込んで利用する。
code:main.py
from fastapi import FastAPI
from .config import settings
app = FastAPI()
@app.get("/info")
async def info():
return {
"app_name": settings.app_name,
"admin_email": settings.admin_email,
"items_per_user": settings.items_per_user,
}
そして.envファイルによる環境変数の設定方法。
code:shell
pip install se
.envファイルを用意する。
code:.env
ADMIN_EMAIL="mayoumelon@example.com"
APP_NAME="MayoumelonApp"
configファイルでenv_fileにファイル名を設定する。
code:config.py
from pydantic import BaseSettings
class Settings(BaseSettings):
app_name: str = "Awesome API"
admin_email: str
items_per_user: int = 50
class Config:
env_file = ".env"
.envファイルから読み込む処理は重くなりがちな処理なので、リクエストのたびに読み込むのではなく一度だけ行い、その後は同じ設定オブジェクトを再利用するのがいい。
mainにてsettingsを生成するときに@lru_cache()を使うと、Settingsオブジェクトが一度だけ作成されるようになる。
依存注入(Depends)によりAPIにSettingsのインスタンスをあてる。 code:main.py
from functools import lru_cache
from fastapi import Depends, FastAPI
from . import config
app = FastAPI()
@lru_cache()
def get_settings():
return config.Settings()
@app.get("/info")
async def info(settings: config.Settings = Depends(get_settings)):
return {
"app_name": settings.app_name,
"admin_email": settings.admin_email,
"items_per_user": settings.items_per_user,
}