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.
Para executar facilmente um servidor aiohttp dentro de um gerenciador de contexto assíncrono.
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?
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.
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ê?