お疲れ様です。
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においてありますので必要があればご参考ください。
上で記載したの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画面上で「テキスト取得」ボタンを押すとメッセージを取得します。

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


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