app.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #!/usr/bin/env python
  2. from collections import namedtuple
  3. from operator import attrgetter
  4. from random import randint
  5. import sys
  6. from flask import Flask, request, render_template, make_response, jsonify
  7. from pony import orm
  8. if sys.version_info[0] == 3:
  9. xrange = range
  10. _is_pypy = hasattr(sys, "pypy_version_info")
  11. if _is_pypy:
  12. from psycopg2cffi import compat
  13. compat.register()
  14. DBDRIVER = "postgres"
  15. DBHOST = "tfb-database"
  16. # setup
  17. app = Flask(__name__)
  18. app.config[
  19. "STORM_DATABASE_URI"
  20. ] = "{DBDRIVER}://benchmarkdbuser:benchmarkdbpass@{DBHOST}:5432/hello_world".format(
  21. DBDRIVER=DBDRIVER, DBHOST=DBHOST
  22. )
  23. app.config["JSONIFY_PRETTYPRINT_REGULAR"] = False
  24. db = orm.Database()
  25. db.bind(
  26. DBDRIVER,
  27. host=DBHOST,
  28. port=5432,
  29. user="benchmarkdbuser",
  30. password="benchmarkdbpass",
  31. database="hello_world",
  32. )
  33. class World(db.Entity):
  34. _table_ = "world"
  35. id = orm.PrimaryKey(int)
  36. randomNumber = orm.Required(int, column="randomnumber")
  37. def to_dict(self):
  38. """Return object data in easily serializeable format"""
  39. return {"id": self.id, "randomNumber": self.randomNumber}
  40. class Fortune(db.Entity):
  41. _table_ = "fortune"
  42. id = orm.PrimaryKey(int, auto=True)
  43. message = orm.Required(str)
  44. db.generate_mapping(create_tables=False)
  45. def get_num_queries():
  46. try:
  47. num_queries = request.args.get("queries", 1, type=int)
  48. except ValueError:
  49. num_queries = 1
  50. if num_queries < 1:
  51. return 1
  52. if num_queries > 500:
  53. return 500
  54. return num_queries
  55. def generate_ids(num_queries):
  56. ids = {randint(1, 10000) for _ in xrange(num_queries)}
  57. while len(ids) < num_queries:
  58. ids.add(randint(1, 10000))
  59. return list(sorted(ids))
  60. @app.route("/json")
  61. def hello():
  62. return jsonify(message="Hello, World!")
  63. @app.route("/query")
  64. def get_random_world():
  65. with orm.db_session(serializable=False):
  66. worlds = [World[ident].to_dict() for ident in generate_ids(get_num_queries())]
  67. return jsonify(worlds)
  68. @app.route("/db")
  69. def get_random_world_single():
  70. wid = randint(1, 10000)
  71. with orm.db_session(serializable=False):
  72. world = World[wid]
  73. return jsonify(world.to_dict())
  74. @app.route("/fortunes")
  75. def get_fortunes():
  76. with orm.db_session(serializable=False):
  77. fortunes = list(orm.select(fortune for fortune in Fortune))
  78. tmp_fortune = namedtuple("Fortune", ["id", "message"])
  79. fortunes.append(
  80. tmp_fortune(id=0, message="Additional fortune added at request time.")
  81. )
  82. fortunes.sort(key=attrgetter("message"))
  83. return render_template("fortunes.html", fortunes=fortunes)
  84. @app.route("/updates")
  85. def updates():
  86. """Test 5: Database Updates"""
  87. num_queries = get_num_queries()
  88. ids = generate_ids(num_queries)
  89. ids.sort()
  90. worlds = []
  91. with orm.db_session(serializable=False):
  92. for ident in ids:
  93. world = World[ident]
  94. world.randomNumber = randint(1, 10000)
  95. worlds.append({"id": world.id, "randomNumber": world.randomNumber})
  96. return jsonify(worlds)
  97. @app.route("/plaintext")
  98. def plaintext():
  99. """Test 6: Plaintext"""
  100. response = make_response(b"Hello, World!")
  101. response.content_type = "text/plain"
  102. return response
  103. try:
  104. import meinheld
  105. meinheld.server.set_access_logger(None)
  106. meinheld.set_keepalive(120)
  107. except ImportError:
  108. pass
  109. # entry point for debugging
  110. if __name__ == "__main__":
  111. app.run(debug=True)