app.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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(loader=PackageLoader("app", "templates"), autoescape=True, auto_reload=False)
  22. app = Klein()
  23. class Fortune(Base):
  24. __tablename__ = "Fortune"
  25. id = Column(Integer, primary_key=True)
  26. message = Column(String)
  27. def serialize(self):
  28. return {
  29. 'id': self.id,
  30. 'randomNumber': self.randomNumber,
  31. }
  32. class World(Base):
  33. __tablename__ = "World"
  34. id = Column(Integer, primary_key=True)
  35. randomNumber = Column(Integer)
  36. def serialize(self):
  37. return {
  38. 'id': self.id,
  39. 'randomNumber': self.randomNumber,
  40. }
  41. def getQueryNum(queryString):
  42. try:
  43. num_queries = int(queryString)
  44. if num_queries < 1:
  45. return 1
  46. if num_queries > 500:
  47. return 500
  48. return num_queries
  49. except ValueError:
  50. return 1
  51. def close_session(func):
  52. @wraps(func)
  53. def wrapper(request):
  54. try:
  55. return func(request)
  56. finally:
  57. db_session.close()
  58. return wrapper
  59. @app.route("/plaintext")
  60. def plaintext(request):
  61. request.setHeader("Content-Type", "text/plain; charset=UTF-8")
  62. return "Hello, World!"
  63. @app.route("/json")
  64. def jsonHandler(request):
  65. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  66. return json.dumps({"message": "Hello, World!"})
  67. @app.route("/db")
  68. @close_session
  69. def db(request):
  70. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  71. wid = randint(1, 10000)
  72. world = db_session.query(World).get(wid).serialize()
  73. return json.dumps(world)
  74. @app.route("/queries")
  75. @close_session
  76. def queries(request):
  77. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  78. num_queries = getQueryNum(request.args.get("queries")[0])
  79. rp = partial(randint, 1, 10000)
  80. get = db_session.query(World).get
  81. worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
  82. return json.dumps(worlds)
  83. @app.route("/updates")
  84. @close_session
  85. def updates(request):
  86. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  87. num_queries = getQueryNum(request.args.get("queries")[0])
  88. worlds = []
  89. rp = partial(randint, 1, 10000)
  90. ids = [rp() for _ in xrange(num_queries)]
  91. ids.sort()
  92. for id in ids:
  93. world = db_session.query(World).get(id)
  94. world.randomNumber = rp()
  95. worlds.append(world.serialize())
  96. db_session.commit()
  97. return json.dumps(worlds)
  98. @app.route("/fortune")
  99. @close_session
  100. def fortune(request):
  101. request.setHeader("Content-Type", "text/html; charset=UTF-8")
  102. fortunes = db_session.query(Fortune).all()
  103. fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
  104. fortunes.sort(key=attrgetter("message"))
  105. template = env.get_template("fortunes.html")
  106. return template.render(fortunes=fortunes)
  107. if __name__ == "__main__":
  108. app.run("0.0.0.0", 8080)
  109. # vim: set expandtab sw=4 sts=4 ts=4 :