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

Criado em 4 dez. 2019  ·  3Comentários  ·  Fonte: aio-libs/aiohttp

Longa história curta

Acho que gostaria de fazer:

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

para reutilizar uma sessão de cliente aiohttp durante toda a vida de um servidor. Ou qualquer outro gerenciador de contexto assíncrono como uma conexão a um banco de dados e assim por diante.

Comportamento esperado

Para executar facilmente um servidor aiohttp dentro de um gerenciador de contexto assíncrono.

Comportamento real

Na verdade estou fazendo:

    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)

mas não tenho orgulho disso.

Obviamente, isso não pode ser feito com o run_app real, e provavelmente pode ser feito facilmente com o _run_app , mas, _ .

Talvez o AppRunner pudesse comer algum código de _run_app permitindo que alguém contornasse _run_app com algo como:

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

Parece uma boa ideia? Devo tentar um PR? Ou estou entendendo algo errado?

pr-merged question

Comentários muito úteis

Olá @JulienPalard , você está ciente do contexto de limpeza? https://docs.aiohttp.org/en/stable/web_advanced.html#cleanup -context

Isso funcionaria para você?

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)

Todos 3 comentários

Olá @JulienPalard , você está ciente do contexto de limpeza? https://docs.aiohttp.org/en/stable/web_advanced.html#cleanup -context

Isso funcionaria para você?

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)

Perdi o cleanup_ctx ao ler o documento, obrigado!

No meu caso atual, estou tendo dois gerenciadores de contexto, usando cleanup_ctx vez de on_startup e on_cleanup me dá 13 novas linhas para 18 linhas removidas, e não estou mais chamando __aenter__ e __aexit__ mim mesmo, então é melhor, sim.

Provavelmente perdeu um link em algum lugar, para tornar mais fácil encontrar, talvez on_startup ?

Você sugere que a descoberta pode ser melhorada? Você pode tentar melhorar o documento.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

yuval-lb picture yuval-lb  ·  5Comentários

rckclmbr picture rckclmbr  ·  5Comentários

asvetlov picture asvetlov  ·  4Comentários

AtomsForPeace picture AtomsForPeace  ·  5Comentários

zhmiao picture zhmiao  ·  3Comentários