app.py 3.4 KB

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