main.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import os
  2. from pathlib import Path
  3. import aiohttp_jinja2
  4. import aiopg.sa
  5. import asyncpg
  6. import jinja2
  7. from aiohttp import web
  8. from sqlalchemy.engine.url import URL
  9. from .views import (
  10. json,
  11. single_database_query_orm,
  12. multiple_database_queries_orm,
  13. fortunes,
  14. updates,
  15. plaintext,
  16. single_database_query_raw,
  17. multiple_database_queries_raw,
  18. fortunes_raw,
  19. updates_raw,
  20. )
  21. THIS_DIR = Path(__file__).parent
  22. def pg_dsn() -> str:
  23. """
  24. :return: DSN url suitable for sqlalchemy and aiopg.
  25. """
  26. return str(URL(
  27. database='hello_world',
  28. password=os.getenv('PGPASS', 'benchmarkdbpass'),
  29. host=os.getenv('DBHOST', 'localhost'),
  30. port='5432',
  31. username=os.getenv('PGUSER', 'benchmarkdbuser'),
  32. drivername='postgres',
  33. ))
  34. async def startup(app: web.Application):
  35. dsn = pg_dsn()
  36. app.update(
  37. aiopg_engine=await aiopg.sa.create_engine(dsn=dsn, minsize=10, maxsize=20, loop=app.loop),
  38. asyncpg_pool=await asyncpg.create_pool(dsn=dsn, min_size=10, max_size=20, loop=app.loop),
  39. )
  40. async def cleanup(app: web.Application):
  41. app['aiopg_engine'].close()
  42. await app['aiopg_engine'].wait_closed()
  43. await app['asyncpg_pool'].close()
  44. def setup_routes(app):
  45. app.router.add_get('/json', json)
  46. app.router.add_get('/db', single_database_query_orm)
  47. app.router.add_get('/queries', multiple_database_queries_orm)
  48. app.router.add_get('/fortunes', fortunes)
  49. app.router.add_get('/updates', updates)
  50. app.router.add_get('/plaintext', plaintext)
  51. app.router.add_get('/raw/db', single_database_query_raw)
  52. app.router.add_get('/raw/queries', multiple_database_queries_raw)
  53. app.router.add_get('/raw/fortunes', fortunes_raw)
  54. app.router.add_get('/raw/updates', updates_raw)
  55. def create_app(loop):
  56. app = web.Application(loop=loop)
  57. jinja2_loader = jinja2.FileSystemLoader(str(THIS_DIR / 'templates'))
  58. aiohttp_jinja2.setup(app, loader=jinja2_loader)
  59. app.on_startup.append(startup)
  60. app.on_cleanup.append(cleanup)
  61. setup_routes(app)
  62. return app