Параметр lifespan
Параметр lifespan передаётся в конструктор класса FastAPI
и принимает асинхронную функцию-генератор.
Код до оператора yield выполняется при запуске приложения,
а код после yield - при его остановке.
Это современная замена устаревшим событиям startup и shutdown.
Функция получает первым аргументом экземпляр приложения app.
Синтаксис
from contextlib import asynccontextmanager
from fastapi import FastAPI
@asynccontextmanager
async def lifespan(app: FastAPI):
# startup code
yield
# shutdown code
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'}
При запуске сервера в терминале появится строка:
"startup"
При остановке сервера появится строка:
"shutdown"
Пример
Давайте откроем соединение с базой данных при запуске и закроем его при остановке:
from contextlib import asynccontextmanager
from fastapi import FastAPI
db = {}
@asynccontextmanager
async def lifespan(app: FastAPI):
db['connection'] = 'opened'
yield
db['connection'] = 'closed'
app = FastAPI(lifespan=lifespan)
@app.get('/status')
def status():
return {'db': db['connection']}
Результат выполнения кода для адреса /status:
{"db": "opened"}
Пример
Давайте сохраним объект в состоянии приложения
через параметр app.state:
<+python+>
from contextlib import asynccontextmanager
from fastapi import FastAPI
@asynccontextmanager
async def lifespan(app: FastAPI):
app.state.items = ['a', 'b', 'c', 'd', 'e']
yield
app.state.items = []
app = FastAPI(lifespan=lifespan)
@app.get('/items')
def items():
return {'items': app.state.items}
<-python+>
Результат выполнения кода для адреса /items:
{"items": ["a", "b", "c", "d", "e"]}