Жизненный цикл
Приложение Starlette может зарегистрировать обработчик жизненного цикла для обработки кода, который должен быть запущен до запуска приложения или при его закрытии.
Импорт contextlib
from Starlette.applications import Starlette
Contextlib.asynccontextmanager
async def lifespan(app):
async with some_async_resource ():
«Run at Startup!»
Yield
«Run on shutdown!»
routes = [
...
]
app = Starlette(routes=routes, lifespan=lifespan)
Starlette не начинает обрабатывать входящие запросы до завершения жизненного цикла.
После того как все соединения отключены, а все текущие фоновые задачи выполнены, срок службы будет разобран.
Подумайте об использовании anyio.create_task_group() для управления асинхронными задачами.
Жизненный статус
Жизненный цикл имеет концепцию state, словарь, который можно использовать для совместного использования объектов между продолжительностью жизни и запросами.
Импорт contextlib
from typing import AsyncIterator, TypedDict
Import Tpx
from Starlette.applications import Starlette
Из starlette.requests import Request
from starlette.responses import PlainTextResponse
От Starlet.routing Import Route
class State(TypedDict):
http_client: httpx.AsyncClient
Contextlib.asynccontextmanager
async def lifespan(app: Starlette) -> AsyncIterator (State):
async with httpx.asyncClient() as client:
Yield {"http_client": client}
async def homepage(request: Request) -> PlainTextResponse:
client = request.state.http_client
response = await client.get ("https://www.example.com")
return PlainTextResponse(response.text)
Слайд (
lifespan=lifespan,
routes=[Route("/", Homepage)]
)
state, полученный в запросе, представляет собой мелкую копию состояния, полученного в обработчике жизненного цикла.
Срок работы во время тестирования
Вы должны использовать TestClient в качестве контекстного менеджера, чтобы гарантировать срок службы вызова.
Из example import app
Testclient import TestClient
def test_homepage ():
with TestClient(приложение) as client:
# Application's lifespan is called on entering the block
response = client.get ("/")
assert response. status_code == 200
And the Lifespan's teardown is run When exiting the block.