app.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from random import randint, sample
  2. from emmett import App, request
  3. from emmett.orm import Database, Model, Field, rowmethod
  4. from emmett.tools import service
  5. app = App(__name__)
  6. class World(Model):
  7. tablename = "world"
  8. randomnumber = Field.int()
  9. @rowmethod('serialize')
  10. def _serialize(self, row):
  11. return {'id': row.id, 'randomNumber': row.randomnumber}
  12. class Fortune(Model):
  13. tablename = "fortune"
  14. message = Field.string()
  15. @rowmethod('serialize')
  16. def _serialize(self, row):
  17. return {'id': row.id, 'message': row.message}
  18. app.config.handle_static = False
  19. app.config.db.adapter = 'postgres:psycopg2'
  20. app.config.db.host = 'tfb-database'
  21. app.config.db.user = 'benchmarkdbuser'
  22. app.config.db.password = 'benchmarkdbpass'
  23. app.config.db.database = 'hello_world'
  24. app.config.db.pool_size = 10
  25. db = Database(app)
  26. db.define_models(World, Fortune)
  27. @app.route()
  28. @service.json
  29. async def json():
  30. return {'message': 'Hello, World!'}
  31. @app.route("/db", pipeline=[db.pipe])
  32. @service.json
  33. async def get_random_world():
  34. return World.get(randint(1, 10000)).serialize()
  35. def get_qparam():
  36. try:
  37. rv = int(request.query_params.queries or 1)
  38. except ValueError:
  39. return 1
  40. if rv < 1:
  41. return 1
  42. if rv > 500:
  43. return 500
  44. return rv
  45. @app.route("/queries", pipeline=[db.pipe])
  46. @service.json
  47. async def get_random_worlds():
  48. num_queries = get_qparam()
  49. row_ids = sample(range(1, 10000), num_queries)
  50. worlds = [World.get(row_id).serialize() for row_id in row_ids]
  51. return worlds
  52. @app.route(pipeline=[db.pipe], output='template')
  53. async def fortunes():
  54. fortune = Fortune.new(message="Additional fortune added at request time.")
  55. fortune.id = 0
  56. fortunes = Fortune.all().select()
  57. fortunes.append(fortune)
  58. fortunes.sort(lambda m: m.message)
  59. return {'fortunes': fortunes}
  60. @app.route(pipeline=[db.pipe])
  61. @service.json
  62. async def updates():
  63. num_queries = get_qparam()
  64. updates = list(zip(
  65. sample(range(1, 10000), num_queries),
  66. sorted(sample(range(1, 10000), num_queries))
  67. ))
  68. worlds = []
  69. for row_id, number in updates:
  70. world = World.get(row_id)
  71. world.update_record(randomnumber=number)
  72. worlds.append(world.serialize())
  73. return worlds
  74. @app.route(output='bytes')
  75. async def plaintext():
  76. return b'Hello, World!'