app.py 2.6 KB

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