Ga naar inhoud

Lifespan

Starlette-applicaties kunnen een levenscyclushandler registreren voor het verwerken van code die moet worden uitgevoerd voordat de applicatie start of wanneer de applicatie wordt gesloten.

Contextlib importeren

Starlette.applicaties importeren vanuit Starlette


@ contextlib.asynccontextmanager
Async def levensduur (app):
    Async met sommige _ async _ bronnen ():
        Afdrukken ("Uitvoeren bij opstarten!")
        Opbrengst
        Afdrukken ("Uitvoeren bij afsluiten!")


Routes = [
    ...
]

App = Starlette (routes = routes, levensduur = levensduur)

Starlette begint pas met het verwerken van inkomende verzoeken als de levenscyclus is afgelopen.

Zodra alle verbindingen zijn gesloten en alle lopende achtergrondtaken zijn voltooid, wordt de levensduur gedemonteerd.

Overweeg anyio.create_task_group() te gebruiken om asynchrone taken te beheren.

Levensduur staat

Lifetime heeft het concept van state, een woordenboek dat kan worden gebruikt om objecten te delen tussen levensduur en verzoeken.

Contextlib importeren
Vanaf het typen van import AsyncIterator, TypedDict

Htpx importeren
Starlette.applicaties importeren vanuit Starlette
Van starlette. aanvragen import aanvragen
Vanaf starlette.reacties importeren PlainTextResponse
Van starlette. routing importeren Route


Klassestaat (TypedDict):
    http _ client: htpx. AsyncClient


@ contextlib.asynccontextmanager
Async def levensduur (app: Starlette) - > AsyncIterator [staat]:
    Async met htpx. AsyncClient () als client:
        Opbrengst {"http_client": client}


Async def startpagina (aanvraag: aanvraag) - > PlainTextResponse:
    Client = aanvraag.state.http _ client
    Reactie = afwachten client.get ("https://www.example.com")
    Retourneert PlainTextResponse (response.text)


Uitgever: App = Starlette (
    Levensduur = levensduur,
    Routes = [Route ("/", startpagina)]
)

De state die op het verzoek is ontvangen, is een ondiepe kopie van de staat die op de levenslange handler is ontvangen.

Leven tijdens testen

U moet TestClient gebruiken als contextmanager om de levensduur van gesprekken te garanderen.

Uit voorbeeld import app
Vanaf starlette.testclient importeren TestClient


Def test _ startpagina ():
    Met TestClient (app) als client:
        # De levensduur van de applicatie wordt aangeroepen bij het betreden van het blok.
        Reactie = client.get ("/")
        Antwoord. status _ code = = 200

    # En de levensduur van de demontage loopt bij het verlaten van het blok.