<p>aiohttp server: run_app coroutine?</p>

Erstellt am 4. Dez. 2019  ·  3Kommentare  ·  Quelle: aio-libs/aiohttp

Um es kurz zu machen

Ich denke, ich würde gerne tun:

async with ClientSession() as session:
    await web.run_app(app)

Wiederverwenden einer Aiohttp-Client-Sitzung während der gesamten Lebensdauer eines Servers. Oder jeder andere asynchrone Kontextmanager wie eine Verbindung zu einer Datenbank und so weiter.

Erwartetes Verhalten

Einfaches Ausführen eines Aiohttp-Servers in einem asynchronen Kontextmanager.

Tatsächliches Verhalten

Ich mache eigentlich:

    async def on_startup_wrapper(app):
        app["aiohttp_client_session"] = await ClientSession().__aenter__()

    async def on_cleanup_wrapper(app):
        await app["aiohttp_client_session"].__aexit__(None, None, None)

    app.on_startup.append(on_startup_wrapper)
    app.on_cleanup.append(on_cleanup_wrapper)

aber ich bin nicht stolz darauf.

Offensichtlich kann es nicht mit den tatsächlichen run_app , und wahrscheinlich leicht mit den _run_app , aber _ .

Vielleicht könnten die AppRunner einen Code von _run_app essen, der es einem ermöglicht, _run_app mit etwas wie:

runner = AppRunner(app, ...)
await runner.setup(host, path, sock, port)  # Doing most of _run_app current code here
async with Something() as something:
    app["something"] = something
    await runner.run_forever()  # The while True of the current _run_app

Sieht es nach einer guten Idee aus? Soll ich eine PR versuchen? Oder verstehe ich etwas falsch?

pr-merged question

Hilfreichster Kommentar

Hey @JulienPalard , kennen Sie den Bereinigungskontext? https://docs.aiohttp.org/en/stable/web_advanced.html#cleanup -context

Würde das für dich funktionieren?

async def init_session_ctx(app):
    async with ClientSession() as session:
        app["aiohttp_client_session"] = session
        try:
            yield
        finally:
            del app["aiohttp_client_session"]

app.cleanup_ctx.append(init_session_ctx)

Alle 3 Kommentare

Hey @JulienPalard , kennen Sie den Bereinigungskontext? https://docs.aiohttp.org/en/stable/web_advanced.html#cleanup -context

Würde das für dich funktionieren?

async def init_session_ctx(app):
    async with ClientSession() as session:
        app["aiohttp_client_session"] = session
        try:
            yield
        finally:
            del app["aiohttp_client_session"]

app.cleanup_ctx.append(init_session_ctx)

Ich habe cleanup_ctx beim Lesen des Dokuments verpasst, danke!

In meinem aktuellen Fall habe ich zwei Kontextmanager, die cleanup_ctx anstelle von on_startup und on_cleanup Dadurch erhalte ich 13 neue Zeilen für 18 entfernte Zeilen, und ich bin nicht mehr Ich rufe __aenter__ und __aexit__ selbst an, also ist es besser, ja.

Es fehlt wahrscheinlich irgendwo ein Link, um es einfacher zu machen, von vielleicht on_startup ?

Bedeuten Sie, dass die Auffindbarkeit verbessert werden kann? Sie können gerne versuchen, das Dokument zu verbessern.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen