app.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. # -*- coding: utf-8 -*-
  2. from functools import partial, wraps
  3. import json
  4. from operator import attrgetter
  5. import os
  6. from random import randint
  7. import sys
  8. from jinja2 import Environment, PackageLoader
  9. from klein import Klein, run, route
  10. from sqlalchemy import create_engine, Column
  11. from sqlalchemy.ext.declarative import declarative_base
  12. from sqlalchemy.orm import sessionmaker
  13. from sqlalchemy.types import String, Integer, Unicode
  14. if sys.version_info[0] == 3:
  15. xrange = range
  16. DATABASE_URI = 'mysql://benchmarkdbuser:benchmarkdbpass@tfb-database:3306/hello_world?charset=utf8'
  17. Base = declarative_base()
  18. db_engine = create_engine(DATABASE_URI)
  19. Session = sessionmaker(bind=db_engine)
  20. db_session = Session()
  21. env = Environment(
  22. loader=PackageLoader("app", "templates"),
  23. autoescape=True,
  24. auto_reload=False)
  25. app = Klein()
  26. class Fortune(Base):
  27. __tablename__ = "Fortune"
  28. id = Column(Integer, primary_key=True)
  29. message = Column(String)
  30. def serialize(self):
  31. return {
  32. 'id': self.id,
  33. 'randomNumber': self.randomNumber,
  34. }
  35. class World(Base):
  36. __tablename__ = "World"
  37. id = Column(Integer, primary_key=True)
  38. randomNumber = Column(Integer)
  39. def serialize(self):
  40. return {
  41. 'id': self.id,
  42. 'randomNumber': self.randomNumber,
  43. }
  44. def getQueryNum(queryString):
  45. try:
  46. num_queries = int(queryString)
  47. if num_queries < 1:
  48. return 1
  49. if num_queries > 500:
  50. return 500
  51. return num_queries
  52. except ValueError:
  53. return 1
  54. def close_session(func):
  55. @wraps(func)
  56. def wrapper(request):
  57. try:
  58. return func(request)
  59. finally:
  60. db_session.close()
  61. return wrapper
  62. @app.route("/plaintext")
  63. def plaintext(request):
  64. request.setHeader("Content-Type", "text/plain; charset=UTF-8")
  65. return "Hello, World!"
  66. @app.route("/json")
  67. def jsonHandler(request):
  68. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  69. return json.dumps({"message": "Hello, World!"})
  70. @app.route("/db")
  71. @close_session
  72. def db(request):
  73. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  74. wid = randint(1, 10000)
  75. world = db_session.query(World).get(wid).serialize()
  76. return json.dumps(world)
  77. @app.route("/queries")
  78. @close_session
  79. def queries(request):
  80. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  81. num_queries = getQueryNum(request.args.get("queries")[0])
  82. rp = partial(randint, 1, 10000)
  83. get = db_session.query(World).get
  84. worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
  85. return json.dumps(worlds)
  86. @app.route("/updates")
  87. @close_session
  88. def updates(request):
  89. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  90. num_queries = getQueryNum(request.args.get("queries")[0])
  91. worlds = []
  92. rp = partial(randint, 1, 10000)
  93. ids = [rp() for _ in xrange(num_queries)]
  94. ids.sort()
  95. for id in ids:
  96. world = db_session.query(World).get(id)
  97. world.randomNumber = rp()
  98. worlds.append(world.serialize())
  99. db_session.commit()
  100. return json.dumps(worlds)
  101. @app.route("/fortune")
  102. @close_session
  103. def fortune(request):
  104. request.setHeader("Content-Type", "text/html; charset=UTF-8")
  105. fortunes = db_session.query(Fortune).all()
  106. fortunes.append(
  107. Fortune(id=0, message="Additional fortune added at request time."))
  108. fortunes.sort(key=attrgetter("message"))
  109. template = env.get_template("fortunes.html")
  110. return template.render(fortunes=fortunes)
  111. if __name__ == "__main__":
  112. app.run("0.0.0.0", 8080)
  113. # vim: set expandtab sw=4 sts=4 ts=4 :