app.py 4.5 KB

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