import asyncio from aiohttp import web from aiopg.sa import create_engine from db import dsn, tbl async def list_view(request): engine = request.app['engine'] body = '' async with engine.acquire() as conn: async for row in conn.execute(tbl.select()): body += '
{}: {}
\n'.format(row.id, row.val) return web.Response(body=body.encode()) async def finish_controller(app): print('closing engine') engine = app['engine'] engine.close() await engine.wait_closed() def app(loop=None): loop = loop or asyncio.get_event_loop() _app = web.Application(loop=loop) _app['engine'] = loop.run_until_complete(create_engine(dsn, loop=loop)) _app.register_on_finish(finish_controller) _app.router.add_route('GET', '/', list_view) return _app if __name__ == '__main__': loop = asyncio.get_event_loop() the_app = app(loop) handler = the_app.make_handler() f = loop.create_server(handler, '0.0.0.0', 8000) srv = loop.run_until_complete(f) print('serving on', srv.sockets[0].getsockname()) try: loop.run_forever() except KeyboardInterrupt: pass finally: srv.close() loop.run_until_complete(srv.wait_closed()) loop.run_until_complete(handler.finish_connections(1.0)) loop.run_until_complete(the_app.finish()) loop.close()