app.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #!/usr/bin/env python
  2. from functools import partial
  3. import json
  4. from operator import attrgetter
  5. from random import randint
  6. import sys
  7. import flask
  8. from flask import Flask, request, render_template, make_response, jsonify
  9. from flask.ext.sqlalchemy import SQLAlchemy
  10. from sqlalchemy import create_engine
  11. if sys.version_info[0] == 3:
  12. xrange = range
  13. try:
  14. import MySQLdb
  15. mysql_schema = "mysql:"
  16. except ImportError:
  17. mysql_schema = "mysql+pymysql:"
  18. # setup
  19. app = Flask(__name__)
  20. app.config['SQLALCHEMY_DATABASE_URI'] = mysql_schema + '//benchmarkdbuser:benchmarkdbpass@DBHOSTNAME:3306/hello_world?charset=utf8'
  21. app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False
  22. db = SQLAlchemy(app)
  23. dbraw_engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'])
  24. # models
  25. class World(db.Model):
  26. __tablename__ = "World"
  27. id = db.Column(db.Integer, primary_key=True)
  28. randomNumber = db.Column(db.Integer)
  29. # http://stackoverflow.com/questions/7102754/jsonify-a-sqlalchemy-result-set-in-flask
  30. @property
  31. def serialize(self):
  32. """Return object data in easily serializeable format"""
  33. return {
  34. 'id' : self.id,
  35. 'randomNumber': self.randomNumber
  36. }
  37. class Fortune(db.Model):
  38. __tablename__ = "Fortune"
  39. id = db.Column(db.Integer, primary_key=True)
  40. message = db.Column(db.String)
  41. # views
  42. # flask.jsonify doesn't allow array at top level for security concern.
  43. # So we should have oriiginal one.
  44. def json_response(obj):
  45. res = make_response(json.dumps(obj))
  46. res.mimetype = "application/json"
  47. return res
  48. @app.route("/json")
  49. def hello():
  50. return jsonify(message='Hello, World!')
  51. @app.route("/db")
  52. def get_random_world():
  53. num_queries = request.args.get("queries", 1, type=int)
  54. worlds = [World.query.get(randint(1, 10000)).serialize
  55. for _ in xrange(num_queries)]
  56. return json_response(worlds)
  57. @app.route("/dbs")
  58. def get_random_world_single():
  59. wid = randint(1, 10000)
  60. worlds = World.query.get(wid).serialize
  61. return json_response(worlds)
  62. @app.route("/dbraw")
  63. def get_random_world_raw():
  64. connection = dbraw_engine.connect()
  65. num_queries = request.args.get("queries", 1, type=int)
  66. worlds = []
  67. for i in xrange(num_queries):
  68. wid = randint(1, 10000)
  69. result = connection.execute("SELECT * FROM World WHERE id = " + str(wid)).fetchone()
  70. worlds.append({'id': result[0], 'randomNumber': result[1]})
  71. connection.close()
  72. return json_response(worlds)
  73. @app.route("/dbsraw")
  74. def get_random_world_single_raw():
  75. connection = dbraw_engine.connect()
  76. wid = randint(1, 10000)
  77. result = connection.execute("SELECT * FROM World WHERE id = " + str(wid)).fetchone()
  78. worlds = {'id': result[0], 'randomNumber': result[1]}
  79. connection.close()
  80. return json_response(worlds)
  81. @app.route("/fortunes")
  82. def get_fortunes():
  83. fortunes = list(Fortune.query.all())
  84. fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
  85. fortunes.sort(key=attrgetter('message'))
  86. return render_template('fortunes.html', fortunes=fortunes)
  87. @app.route("/fortunesraw")
  88. def get_forutens_raw():
  89. fortunes = list(dbraw_engine.execute("SELECT * FROM Fortune"))
  90. fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
  91. fortunes.sort(key=attrgetter('message'))
  92. return render_template('fortunes.html', fortunes=fortunes)
  93. @app.route("/updates")
  94. def updates():
  95. """Test 5: Database Updates"""
  96. num_queries = request.args.get('queries', 1, type=int)
  97. if num_queries > 500:
  98. num_queries = 500
  99. worlds = []
  100. rp = partial(randint, 1, 10000)
  101. ids = [rp() for _ in xrange(num_queries)]
  102. ids.sort() # To avoid deadlock
  103. for id in ids:
  104. world = World.query.get(id)
  105. world.randomNumber = rp()
  106. worlds.append(world.serialize)
  107. db.session.commit()
  108. return json_response(worlds)
  109. @app.route("/raw-updates")
  110. def raw_updates():
  111. """Test 5: Database Updates"""
  112. num_queries = request.args.get('queries', 1, type=int)
  113. if num_queries > 500:
  114. num_queries = 500
  115. worlds = []
  116. rp = partial(randint, 1, 10000)
  117. for i in xrange(num_queries):
  118. world = dbraw_engine.execute("SELECT * FROM World WHERE id=%s", (rp(),)).fetchone()
  119. randomNumber = rp()
  120. worlds.append({'id': world['id'], 'randomNumber': randomNumber})
  121. dbraw_engine.execute("UPDATE World SET randomNumber=%s WHERE id=%s",
  122. (randomNumber, world['id']))
  123. return json_response(worlds)
  124. @app.route('/plaintext')
  125. def plaintext():
  126. """Test 6: Plaintext"""
  127. response = make_response(b'Hello, World!')
  128. response.content_type = 'text/plain'
  129. return response
  130. # entry point for debugging
  131. if __name__ == "__main__":
  132. app.run(debug=True)