【FastAPI】開始時と終了時に処理を管理するlifespanについて【備忘録】

お疲れ様です。

FastAPIでlifespanという機能を使う機会があったのでメモ。

lifespanの公式ドキュメントはこちら。 fastapi.tiangolo.com

機能の内容をざっくりというとAPIの起動時と終了時の処理を管理するというものです。

コードは以下のようになり、yieldの前に起動時の処理、後に終了時の処理を書きます。 また、yieldにデータを渡すことでリソースの共有も可能です。 以前記事にしたapp.state と似たような使い方ができます。

FastAPIのappを定義する前に設定して、定義時に引数で与えるという形になります。

@asynccontextmanager
async def lifespan(app: FastAPI):
    # アプリ起動時の処理
    print("アプリ起動")
    
    yield {"msg": "起動時に設定したメッセージ"}
    
    # アプリ終了時の処理
    print("アプリ終了")


app = FastAPI(lifespan=lifespan)

デモ

デモコードを作成しました。コードはGitHubにおいてありますので必要があればご参考ください。

github.com

上で記載したのlifespanの処理で設定した値(msg)を取得して画面に表示します。 呼び出すAPIはこんな感じ。lifespanで設定した値はreq.stateで取り出せます。 ほぼ同じ処理でrouterも作成しています。

@app.get("/message")
def get_message_1(
    req: Request
) -> str:
    """メッセージ取得API
    """
    print("メッセージ取得")
    
    # 起動時に設定したメッセージを取得
    msg = req.state.msg
    
    return msg

web画面上で「テキスト取得」ボタンを押すとメッセージを取得します。 app

結果はこんな感じ。 routerの方は"(router)"と付けています。どちらの場合でも起動時に設定した値を取得できています。

result1
result2

ログの方を見るとサーバ立ち上げ時と停止時にそれぞれprintが表示されているのを確認できます。 log

参考