| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | # -*- coding: utf-8 -*-from functools import partial, wrapsimport jsonfrom operator import attrgetterimport osfrom random import randintimport sysfrom jinja2 import Environment, PackageLoaderfrom klein import Klein, run, routefrom sqlalchemy import create_engine, Columnfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import sessionmakerfrom sqlalchemy.types import String, Integer, Unicodeif sys.version_info[0] == 3:    xrange = rangeDATABASE_URI = 'mysql://benchmarkdbuser:benchmarkdbpass@tfb-database:3306/hello_world?charset=utf8'Base = declarative_base()db_engine = create_engine(DATABASE_URI)Session = sessionmaker(bind=db_engine)db_session = Session()env = Environment(    loader=PackageLoader("app", "templates"),    autoescape=True,    auto_reload=False)app = Klein()class Fortune(Base):    __tablename__ = "Fortune"    id = Column(Integer, primary_key=True)    message = Column(String)    def serialize(self):        return {            'id': self.id,            'randomNumber': self.randomNumber,        }class World(Base):    __tablename__ = "World"    id = Column(Integer, primary_key=True)    randomNumber = Column(Integer)    def serialize(self):        return {            'id': self.id,            'randomNumber': self.randomNumber,        }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 1def close_session(func):    @wraps(func)    def wrapper(request):        try:            return func(request)        finally:            db_session.close()    return wrapper@app.route("/plaintext")def plaintext(request):    request.setHeader("Content-Type", "text/plain; charset=UTF-8")    return "Hello, World!"@app.route("/json")def jsonHandler(request):    request.setHeader("Content-Type", "application/json; charset=UTF-8")    return json.dumps({"message": "Hello, World!"})@app.route("/db")@close_sessiondef db(request):    request.setHeader("Content-Type", "application/json; charset=UTF-8")    wid = randint(1, 10000)    world = db_session.query(World).get(wid).serialize()    return json.dumps(world)@app.route("/queries")@close_sessiondef queries(request):    request.setHeader("Content-Type", "application/json; charset=UTF-8")    num_queries = getQueryNum(request.args.get("queries")[0])    rp = partial(randint, 1, 10000)    get = db_session.query(World).get    worlds = [get(rp()).serialize() for _ in xrange(num_queries)]    return json.dumps(worlds)@app.route("/updates")@close_sessiondef updates(request):    request.setHeader("Content-Type", "application/json; charset=UTF-8")    num_queries = getQueryNum(request.args.get("queries")[0])    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())    db_session.commit()    return json.dumps(worlds)@app.route("/fortune")@close_sessiondef fortune(request):    request.setHeader("Content-Type", "text/html; charset=UTF-8")    fortunes = db_session.query(Fortune).all()    fortunes.append(        Fortune(id=0, message="Additional fortune added at request time."))    fortunes.sort(key=attrgetter("message"))    template = env.get_template("fortunes.html")    return template.render(fortunes=fortunes)if __name__ == "__main__":    app.run("0.0.0.0", 8080)# vim: set expandtab sw=4 sts=4 ts=4 :
 |