콘텐츠로 이동

이벤트: startup과 shutdown

필요에 따라 응용 프로그램이 시작되기 전이나 종료될 때 실행되는 이벤트 핸들러(함수)를 정의할 수 있습니다.

이 함수들은 async def 또는 평범하게 def으로 선언할 수 있습니다.

경고

이벤트 핸들러는 주 응용 프로그램에서만 작동합니다. 하위 응용 프로그램 - 마운트에서는 작동하지 않습니다.

startup 이벤트

응용 프로그램을 시작하기 전에 실행하려는 함수를 "startup" 이벤트로 선언합니다:

from fastapi import FastAPI

app = FastAPI()

items = {}


@app.on_event("startup")
async def startup_event():
    items["foo"] = {"name": "Fighters"}
    items["bar"] = {"name": "Tenders"}


@app.get("/items/{item_id}")
async def read_items(item_id: str):
    return items[item_id]

이 경우 startup 이벤트 핸들러 함수는 단순히 몇 가지 값으로 구성된 dict 형식의 "데이터베이스"를 초기화합니다.

하나 이상의 이벤트 핸들러 함수를 추가할 수도 있습니다.

그리고 응용 프로그램은 모든 startup 이벤트 핸들러가 완료될 때까지 요청을 받지 않습니다.

shutdown 이벤트

응용 프로그램이 종료될 때 실행하려는 함수를 추가하려면 "shutdown" 이벤트로 선언합니다:

from fastapi import FastAPI

app = FastAPI()


@app.on_event("shutdown")
def shutdown_event():
    with open("log.txt", mode="a") as log:
        log.write("Application shutdown")


@app.get("/items/")
async def read_items():
    return [{"name": "Foo"}]

이 예제에서 shutdown 이벤트 핸들러 함수는 "Application shutdown"이라는 텍스트가 적힌 log.txt 파일을 추가할 것입니다.

정보

open() 함수에서 mode="a"는 "추가"를 의미합니다. 따라서 이미 존재하는 파일의 내용을 덮어쓰지 않고 새로운 줄을 추가합니다.

이 예제에서는 파일과 상호작용 하기 위해 파이썬 표준 함수인 open()을 사용하고 있습니다.

따라서 디스크에 데이터를 쓰기 위해 "대기"가 필요한 I/O (입력/출력) 작업을 수행합니다.

그러나 open()asyncawait을 사용하지 않기 때문에 이벤트 핸들러 함수는 async def가 아닌 표준 def로 선언하고 있습니다.

정보

이벤트 핸들러에 관한 내용은 Starlette 이벤트 문서에서 추가로 확인할 수 있습니다.