app.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from bottle import Bottle, route, request, run, template
  2. from bottle.ext import sqlalchemy
  3. from sqlalchemy import create_engine, Column, Integer, Unicode
  4. from sqlalchemy.ext.declarative import declarative_base
  5. from random import randint
  6. import ujson
  7. from operator import attrgetter, itemgetter
  8. from functools import partial
  9. app = Bottle()
  10. app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://benchmarkdbuser:benchmarkdbpass@DBHOSTNAME:3306/hello_world?charset=utf8'
  11. Base = declarative_base()
  12. db_engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'])
  13. plugin = sqlalchemy.Plugin(db_engine, keyword='db', )
  14. app.install(plugin)
  15. class World(Base):
  16. __tablename__ = "World"
  17. id = Column(Integer, primary_key=True)
  18. randomNumber = Column(Integer)
  19. # http://stackoverflow.com/questions/7102754/jsonify-a-sqlalchemy-result-set-in-flask
  20. @property
  21. def serialize(self):
  22. """Return object data in easily serializeable format"""
  23. return {
  24. 'id' : self.id,
  25. 'randomNumber': self.randomNumber
  26. }
  27. class Fortune(Base):
  28. __tablename__ = "Fortune"
  29. id = Column(Integer, primary_key=True)
  30. message = Column(Unicode)
  31. @app.route("/json")
  32. def hello():
  33. resp = {"message": "Hello, World!"}
  34. return ujson.dumps(resp)
  35. @app.route("/db")
  36. def get_random_world(db):
  37. num_queries = request.query.queries or '1'
  38. worlds = []
  39. rp = partial(randint, 1, 10000)
  40. for i in xrange(int(num_queries)):
  41. worlds.append(db.query(World).get(rp()).serialize)
  42. return ujson.dumps(worlds)
  43. @app.route("/dbs")
  44. def get_random_world_single(db):
  45. wid = randint(1, 10000)
  46. worlds = [db.query(World).get(wid).serialize]
  47. return ujson.dumps(worlds)
  48. @app.route("/dbraw")
  49. def get_random_world_raw():
  50. connection = db_engine.connect()
  51. num_queries = request.query.queries or '1'
  52. worlds = []
  53. rp = partial(randint, 1, 10000)
  54. for i in range(int(num_queries)):
  55. result = connection.execute("SELECT * FROM world WHERE id = " + str(rp())).fetchone()
  56. worlds.append({'id': result[0], 'randomNumber': result[1]})
  57. connection.close()
  58. return ujson.dumps(worlds)
  59. @app.route("/dbsraw")
  60. def get_random_world_single_raw():
  61. connection = db_engine.connect()
  62. wid = randint(1, 10000)
  63. result = connection.execute("SELECT * FROM world WHERE id = " + str(wid)).fetchone()
  64. worlds = [{'id': result[0], 'randomNumber': result[1]}]
  65. connection.close()
  66. return ujson.dumps(worlds)
  67. @app.route("/fortune")
  68. def fortune_orm(db):
  69. fortunes=db.query(Fortune).all()
  70. fortunes.append(Fortune(message="Additional fortune added at request time."))
  71. fortunes=sorted(fortunes, key=attrgetter('message'))
  72. return template('fortune-obj', fortunes=fortunes)
  73. @app.route("/fortuneraw")
  74. def fortune_raw():
  75. connection = db_engine.connect()
  76. fortunes=[(f.id, f.message) for f in connection.execute("SELECT * FROM Fortune")]
  77. fortunes.append((0, u'Additional fortune added at request time.'))
  78. fortunes=sorted(fortunes, key=itemgetter(1))
  79. connection.close()
  80. return template('fortune', fortunes=fortunes)
  81. if __name__ == "__main__":
  82. app.run(host='0.0.0.0', debug=False)