app.py 3.2 KB

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