app.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import os
  2. import sys
  3. import json
  4. from functools import partial
  5. from operator import attrgetter
  6. from random import randint
  7. import bleach
  8. from tg import expose, TGController, AppConfig
  9. from jinja2 import Environment, PackageLoader
  10. from sqlalchemy.orm import scoped_session, sessionmaker
  11. from sqlalchemy import create_engine
  12. from models.Fortune import Fortune
  13. from models.World import World
  14. DBDRIVER = 'mysql'
  15. DBHOSTNAME = os.environ.get('DBHOST', 'localhost')
  16. DATABASE_URI = '%s://benchmarkdbuser:benchmarkdbpass@%s:3306/hello_world?charset=utf8' % (DBDRIVER, DBHOSTNAME)
  17. db_engine = create_engine(DATABASE_URI)
  18. Session = sessionmaker(bind=db_engine)
  19. db_session = Session()
  20. env = Environment(loader=PackageLoader("app", "templates"))
  21. def getQueryNum(queryString):
  22. try:
  23. num_queries = int(queryString)
  24. if num_queries < 1:
  25. return 1
  26. if num_queries > 500:
  27. return 500
  28. return num_queries
  29. except ValueError:
  30. return 1
  31. class RootController(TGController):
  32. @expose(content_type="text/plain")
  33. def plaintext(self):
  34. return "Hello, World!"
  35. @expose("json")
  36. def json(self):
  37. return {"message": "Hello, World!"}
  38. @expose("json")
  39. def db(self):
  40. wid = randint(1, 10000)
  41. world = db_session.query(World).get(wid).serialize()
  42. return world
  43. @expose("json")
  44. def updates(self, queries=1):
  45. num_queries = getQueryNum(queries)
  46. worlds = []
  47. rp = partial(randint, 1, 10000)
  48. ids = [rp() for _ in xrange(num_queries)]
  49. ids.sort()
  50. for id in ids:
  51. world = db_session.query(World).get(id)
  52. world.randomNumber = rp()
  53. worlds.append(world.serialize())
  54. db_session.commit()
  55. return json.dumps(worlds)
  56. @expose("json")
  57. def queries(self, queries=1):
  58. num_queries = getQueryNum(queries)
  59. rp = partial(randint, 1, 10000)
  60. get = db_session.query(World).get
  61. worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
  62. return json.dumps(worlds)
  63. @expose()
  64. def fortune(self):
  65. fortunes = db_session.query(Fortune).all()
  66. fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
  67. fortunes.sort(key=attrgetter("message"))
  68. for f in fortunes:
  69. f.message = bleach.clean(f.message)
  70. template = env.get_template("fortunes.html")
  71. return template.render(fortunes=fortunes)
  72. config = AppConfig(minimal=True, root_controller=RootController())
  73. config.renderers.append("jinja")
  74. app = config.make_wsgi_app()