Событие lifespan
Событие lifespan применяется к приложению
FastAPI и позволяет выполнить код до запуска
и после остановки приложения. Оно передаётся
в параметр lifespan конструктора класса
FastAPI в виде асинхронного контекстного
менеджера. Внутри него до оператора yield
выполняется код запуска, а после yield -
код остановки.
Синтаксис
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app: FastAPI):
# код при запуске
yield
# код при остановке
app = FastAPI(lifespan=lifespan)
Пример
Давайте выполним код при запуске и остановке приложения:
from contextlib import asynccontextmanager
from fastapi import FastAPI
@asynccontextmanager
async def lifespan(app: FastAPI):
print('startup')
yield
print('shutdown')
app = FastAPI(lifespan=lifespan)
@app.get('/')
def index():
return {'text': 'hello'}
Результат выполнения кода при запуске сервера:
uvicorn main:app --reload
В консоли появится сообщение:
"startup"
Пример
Давайте сохраним подключение к базе данных
в состоянии приложения app.state:
<+python+>
from contextlib import asynccontextmanager
from fastapi import FastAPI
@asynccontextmanager
async def lifespan(app: FastAPI):
app.state.db = {'connected': True}
yield
app.state.db = None
app = FastAPI(lifespan=lifespan)
@app.get('/')
def index():
return app.state.db
<-python+>
Результат выполнения кода для адреса '/':
{"connected": true}
Пример
Давайте выполним асинхронную инициализацию ресурса при запуске приложения:
import asyncio
from contextlib import asynccontextmanager
from fastapi import FastAPI
async def connect_db():
await asyncio.sleep(1)
return {'status': 'ready'}
@asynccontextmanager
async def lifespan(app: FastAPI):
app.state.db = await connect_db()
yield
app.state.db = None
app = FastAPI(lifespan=lifespan)
@app.get('/')
def index():
return app.state.db
Результат выполнения кода для адреса '/':
{"status": "ready"}