|
@@ -0,0 +1,93 @@
|
|
|
+import os
|
|
|
+import sys
|
|
|
+import json
|
|
|
+from functools import partial
|
|
|
+from operator import attrgetter
|
|
|
+from random import randint
|
|
|
+
|
|
|
+import bleach
|
|
|
+
|
|
|
+from tg import expose, TGController, AppConfig
|
|
|
+
|
|
|
+from jinja2 import Environment, PackageLoader
|
|
|
+
|
|
|
+from sqlalchemy.orm import scoped_session, sessionmaker
|
|
|
+from sqlalchemy import create_engine
|
|
|
+
|
|
|
+from models.Fortune import Fortune
|
|
|
+from models.World import World
|
|
|
+
|
|
|
+DBDRIVER = 'mysql'
|
|
|
+DBHOSTNAME = os.environ.get('DBHOST', 'localhost')
|
|
|
+DATABASE_URI = '%s://benchmarkdbuser:benchmarkdbpass@%s:3306/hello_world?charset=utf8' % (DBDRIVER, DBHOSTNAME)
|
|
|
+
|
|
|
+db_engine = create_engine(DATABASE_URI)
|
|
|
+Session = sessionmaker(bind=db_engine)
|
|
|
+db_session = Session()
|
|
|
+
|
|
|
+env = Environment(loader=PackageLoader("app", "templates"))
|
|
|
+
|
|
|
+def getQueryNum(queryString):
|
|
|
+ try:
|
|
|
+ num_queries = int(queryString)
|
|
|
+ if num_queries < 1:
|
|
|
+ return 1
|
|
|
+ if num_queries > 500:
|
|
|
+ return 500
|
|
|
+ return num_queries
|
|
|
+ except ValueError:
|
|
|
+ return 1
|
|
|
+
|
|
|
+class RootController(TGController):
|
|
|
+
|
|
|
+ @expose(content_type="text/plain")
|
|
|
+ def plaintext(self):
|
|
|
+ return "Hello, World!"
|
|
|
+
|
|
|
+ @expose("json")
|
|
|
+ def json(self):
|
|
|
+ return {"message": "Hello, World!"}
|
|
|
+
|
|
|
+ @expose("json")
|
|
|
+ def db(self):
|
|
|
+ wid = randint(1, 10000)
|
|
|
+ world = db_session.query(World).get(wid).serialize()
|
|
|
+ return world
|
|
|
+
|
|
|
+ @expose("json")
|
|
|
+ def updates(self, queries=1):
|
|
|
+ num_queries = getQueryNum(queries)
|
|
|
+ worlds = []
|
|
|
+ rp = partial(randint, 1, 10000)
|
|
|
+ ids = [rp() for _ in xrange(num_queries)]
|
|
|
+ ids.sort()
|
|
|
+ for id in ids:
|
|
|
+ world = db_session.query(World).get(id)
|
|
|
+ world.randomNumber = rp()
|
|
|
+ worlds.append(world.serialize())
|
|
|
+ return json.dumps(worlds)
|
|
|
+
|
|
|
+ @expose("json")
|
|
|
+ def queries(self, queries=1):
|
|
|
+ num_queries = getQueryNum(queries)
|
|
|
+ rp = partial(randint, 1, 10000)
|
|
|
+ get = db_session.query(World).get
|
|
|
+ worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
|
|
|
+ return json.dumps(worlds)
|
|
|
+
|
|
|
+
|
|
|
+ @expose()
|
|
|
+ def fortune(self):
|
|
|
+ fortunes = db_session.query(Fortune).all()
|
|
|
+ fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
|
|
|
+ fortunes.sort(key=attrgetter("message"))
|
|
|
+ for f in fortunes:
|
|
|
+ f.message = bleach.clean(f.message)
|
|
|
+ template = env.get_template("fortunes.html")
|
|
|
+ return template.render(fortunes=fortunes)
|
|
|
+
|
|
|
+config = AppConfig(minimal=True, root_controller=RootController())
|
|
|
+config.renderers.append("jinja")
|
|
|
+
|
|
|
+app = config.make_wsgi_app()
|
|
|
+
|