app.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. # -*- coding: utf-8 -*-
  2. from functools import partial
  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. DBDRIVER = 'mysql'
  17. DBHOSTNAME = os.environ.get('DBHOST', 'localhost')
  18. DATABASE_URI = '%s://benchmarkdbuser:benchmarkdbpass@%s:3306/hello_world?charset=utf8' % (DBDRIVER, DBHOSTNAME)
  19. Base = declarative_base()
  20. db_engine = create_engine(DATABASE_URI)
  21. Session = sessionmaker(bind=db_engine)
  22. db_session = Session()
  23. env = Environment(loader=PackageLoader("app", "templates"), autoescape=True, auto_reload=False)
  24. app = Klein()
  25. class Fortune(Base):
  26. __tablename__ = "Fortune"
  27. id = Column(Integer, primary_key=True)
  28. message = Column(String)
  29. def serialize(self):
  30. return {
  31. 'id': self.id,
  32. 'randomNumber': self.randomNumber,
  33. }
  34. class World(Base):
  35. __tablename__ = "World"
  36. id = Column(Integer, primary_key=True)
  37. randomNumber = Column(Integer)
  38. def serialize(self):
  39. return {
  40. 'id': self.id,
  41. 'randomNumber': self.randomNumber,
  42. }
  43. def getQueryNum(queryString):
  44. try:
  45. num_queries = int(queryString)
  46. if num_queries < 1:
  47. return 1
  48. if num_queries > 500:
  49. return 500
  50. return num_queries
  51. except ValueError:
  52. return 1
  53. @app.route("/plaintext")
  54. def plaintext(request):
  55. request.setHeader("Content-Type", "text/plain; charset=UTF-8")
  56. return "Hello, World!"
  57. @app.route("/json")
  58. def jsonHandler(request):
  59. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  60. return json.dumps({"message": "Hello, World!"})
  61. @app.route("/db")
  62. def db(request):
  63. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  64. wid = randint(1, 10000)
  65. world = db_session.query(World).get(wid).serialize()
  66. return json.dumps(world)
  67. @app.route("/queries")
  68. def queries(request):
  69. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  70. num_queries = getQueryNum(request.args.get("queries")[0])
  71. rp = partial(randint, 1, 10000)
  72. get = db_session.query(World).get
  73. worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
  74. return json.dumps(worlds)
  75. @app.route("/updates")
  76. def updates(request):
  77. request.setHeader("Content-Type", "application/json; charset=UTF-8")
  78. num_queries = getQueryNum(request.args.get("queries")[0])
  79. worlds = []
  80. rp = partial(randint, 1, 10000)
  81. ids = [rp() for _ in xrange(num_queries)]
  82. ids.sort()
  83. for id in ids:
  84. world = db_session.query(World).get(id)
  85. world.randomNumber = rp()
  86. worlds.append(world.serialize())
  87. db_session.commit()
  88. return json.dumps(worlds)
  89. @app.route("/fortune")
  90. def fortune(request):
  91. request.setHeader("Content-Type", "text/html; charset=UTF-8")
  92. fortunes = db_session.query(Fortune).all()
  93. fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
  94. fortunes.sort(key=attrgetter("message"))
  95. template = env.get_template("fortunes.html")
  96. return template.render(fortunes=fortunes)
  97. if __name__ == "__main__":
  98. app.run("0.0.0.0", 8080)