콘텐츠로 이동

라이프스팬

Starlette 애플리케이션은 애플리케이션이 시작되기 전이나 애플리케이션이 닫힐 때 실행해야 하는 코드를 처리하기 위해 라이프사이클 핸들러를 등록할 수 있습니다.

컨텍스트 립 가져오기

Starlette. 응용 프로그램이 Starlette에서 가져옵니다.


@
비동기 def 수명(앱):
    일부 _async_와 비동기화():
        인쇄("시작 시 실행!")
        수율
        인쇄("종료 시 실행!")


경로 = [
    ...
]

앱 = Starlette(경로 = 경로, 수명 = 수명)

Starlette는 라이프사이클이 실행될 때까지 들어오는 요청 처리를 시작하지 않습니다.

모든 연결이 닫히고 진행 중인 백그라운드 작업이 완료되면 실행 수명이 분해됩니다.

anyio.create_task_group() 를 사용하여 비동기 작업을 관리하는 것을 고려하십시오.

수명 상태

Lifetime은 state 의 개념을 가지고 있습니다.state 는 수명과 요청 간에 개체를 공유하는 데 사용할 수 있는 사전입니다.

컨텍스트 립 가져오기
가져오기 AsyncIterator, TypedDict 입력에서

htpx 가져오기
Starlette. 응용 프로그램이 Starlette에서 가져옵니다.
스타렛에서. 요청 가져오기 요청
Starlette.에서 일반 텍스트 응답을 가져옵니다.
별자리에서. 라우팅 가져오기 경로


클래스 상태(TypedDict):
    http_client: htpx. AsyncClient


@
Async def 수명(앱: Starlette) -> AsyncIterator [상태]:
    htpx와 비동기화. 클라이언트로 AsyncClient():
        수율 {"http_client": client}


Async def 홈페이지(요청: 요청) -> 일반 텍스트 응답:
    클라이언트 = 요청.stae.http_클라이언트
    응답 = 클라이언트를 기다립니다. ("https://www.example.com")
    일반 텍스트 응답을 반환합니다(


앱 = Starlette (
    수명 = 수명,
    경로 = [경로("/", 홈페이지)]
)

요청에서 받은 state 는 평생 핸들러에서 받은 상태의 얕은 사본입니다.

테스트 중 실행 수명

통화 수명을 보장하려면 TestClient 를 컨텍스트 관리자로 사용해야 합니다.

예에서 앱 가져오기
Starlette.testClient에서 TestClient 가져오기


Def test_():
    TestClient(앱)를 클라이언트로 사용:
        # 블록 진입 시 애플리케이션의 수명이 호출됩니다.
        응답 = client.get ("/")
        응답을 주장합니다. 상태 _ 코드 = = 200

    # 그리고 블록을 나갈 때 수명의 눈물이 흐르고 있습니다.