app_raw.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #!/usr/bin/env python
  2. from collections import namedtuple
  3. from operator import attrgetter, itemgetter
  4. from random import randint
  5. import sys
  6. from flask import Flask, request, render_template, make_response, jsonify
  7. if sys.version_info[0] == 3:
  8. xrange = range
  9. _is_pypy = hasattr(sys, 'pypy_version_info')
  10. if _is_pypy:
  11. from psycopg2cffi.pool import ThreadedConnectionPool
  12. else:
  13. from psycopg2.pool import ThreadedConnectionPool
  14. # setup
  15. app = Flask(__name__)
  16. pool = ThreadedConnectionPool(minconn=2, maxconn=2, database="hello_world", user="benchmarkdbuser", password="benchmarkdbpass", host="tfb-database", port=5432)
  17. READ_ROW_SQL = 'SELECT world."randomnumber", world."id" FROM "world" WHERE id = %(id)s'
  18. WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=%(randomNumber)s WHERE id=%(id)s'
  19. def get_num_queries():
  20. try:
  21. num_queries = request.args.get("queries", 1, type=int)
  22. except ValueError:
  23. num_queries = 1
  24. if num_queries < 1:
  25. return 1
  26. if num_queries > 500:
  27. return 500
  28. return num_queries
  29. def generate_ids(num_queries):
  30. ids = {randint(1, 10000) for _ in xrange(num_queries)}
  31. while len(ids) < num_queries:
  32. ids.add(randint(1, 10000))
  33. return list(sorted(ids))
  34. @app.route("/json")
  35. def hello():
  36. return jsonify(message='Hello, World!')
  37. @app.route("/query")
  38. def get_random_world():
  39. db = pool.getconn()
  40. cursor = db.cursor()
  41. def query(ident):
  42. cursor.execute(READ_ROW_SQL, {"id": ident})
  43. result = cursor.fetchone()
  44. return result
  45. worlds = [{'id': result[0], 'randomNumber': result[1]} for result in map(query, generate_ids(get_num_queries()))]
  46. pool.putconn(db)
  47. return jsonify(worlds)
  48. @app.route("/db")
  49. def get_random_world_single():
  50. db = pool.getconn()
  51. cursor = db.cursor()
  52. cursor.execute(READ_ROW_SQL, {"id": randint(1, 10000)})
  53. result = cursor.fetchone()
  54. world = {'id': result[0], 'randomNumber': result[1]}
  55. pool.putconn(db)
  56. return jsonify(world)
  57. Fortune = namedtuple("Fortune", ["id", "message"])
  58. @app.route("/fortunes")
  59. def get_fortunes():
  60. db = pool.getconn()
  61. cursor = db.cursor()
  62. cursor.execute('SELECT * FROM "Fortune"')
  63. fortunes = [Fortune(id=row[0], message=row[1]) for row in cursor.fetchall()]
  64. fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
  65. fortunes.sort(key=attrgetter('message'))
  66. pool.putconn(db)
  67. return render_template('fortunes.html', fortunes=fortunes)
  68. @app.route("/updates")
  69. def updates():
  70. """Test 5: Database Updates"""
  71. db = pool.getconn()
  72. cursor = db.cursor()
  73. num_queries = get_num_queries()
  74. ids = generate_ids(num_queries)
  75. updates = generate_ids(num_queries)
  76. def query(ident):
  77. cursor.execute(READ_ROW_SQL, {"id": ident})
  78. result = cursor.fetchone()
  79. return result
  80. list(map(query, generate_ids(get_num_queries())))
  81. worlds = [{"id": ident, "randomNumber": update} for ident, update in zip(ids, updates)]
  82. for world in worlds:
  83. cursor.execute(WRITE_ROW_SQL, world)
  84. db.commit()
  85. pool.putconn(db)
  86. return jsonify(worlds)
  87. @app.route('/plaintext')
  88. def plaintext():
  89. """Test 6: Plaintext"""
  90. response = make_response(b'Hello, World!')
  91. response.content_type = 'text/plain'
  92. return response
  93. try:
  94. import meinheld
  95. meinheld.server.set_access_logger(None)
  96. meinheld.set_keepalive(120)
  97. except ImportError:
  98. pass
  99. # entry point for debugging
  100. if __name__ == "__main__":
  101. app.run(debug=True)