#!/usr/bin/env python from collections import namedtuple from operator import attrgetter from random import randint import sys from flask import Flask, request, render_template, make_response, jsonify from pony import orm if sys.version_info[0] == 3: xrange = range _is_pypy = hasattr(sys, 'pypy_version_info') if _is_pypy: from psycopg2cffi import compat compat.register() DBDRIVER = 'postgres' DBHOST = 'tfb-database' # setup app = Flask(__name__) app.config['STORM_DATABASE_URI'] = "{DBDRIVER}://benchmarkdbuser:benchmarkdbpass@{DBHOST}:5432/hello_world".format(DBDRIVER=DBDRIVER, DBHOST=DBHOST) app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False db = orm.Database() db.bind(DBDRIVER, host=DBHOST, port=5432, user="benchmarkdbuser", password="benchmarkdbpass", database="hello_world") class World(db.Entity): _table_ = "world" id = orm.PrimaryKey(int) randomNumber = orm.Required(int, column="randomnumber") def to_dict(self): """Return object data in easily serializeable format""" return { 'id' : self.id, 'randomNumber': self.randomNumber } class Fortune(db.Entity): _table_ = "fortune" id = orm.PrimaryKey(int, auto=True) message = orm.Required(str) db.generate_mapping(create_tables=False) def get_num_queries(): try: num_queries = request.args.get("queries", 1, type=int) except ValueError: num_queries = 1 if num_queries < 1: return 1 if num_queries > 500: return 500 return num_queries def generate_ids(num_queries): ids = {randint(1, 10000) for _ in xrange(num_queries)} while len(ids) < num_queries: ids.add(randint(1, 10000)) return list(sorted(ids)) @app.route("/json") def hello(): return jsonify(message='Hello, World!') @app.route("/query") def get_random_world(): with orm.db_session(serializable=False): worlds = [World[ident].to_dict() for ident in generate_ids(get_num_queries())] return jsonify(worlds) @app.route("/db") def get_random_world_single(): wid = randint(1, 10000) with orm.db_session(serializable=False): world = World[wid] return jsonify(world.to_dict()) @app.route("/fortunes") def get_fortunes(): with orm.db_session(serializable=False): fortunes = list(orm.select(fortune for fortune in Fortune)) tmp_fortune = namedtuple("Fortune", ["id", "message"]) fortunes.append(tmp_fortune(id=0, message="Additional fortune added at request time.")) fortunes.sort(key=attrgetter('message')) return render_template('fortunes.html', fortunes=fortunes) @app.route("/updates") def updates(): """Test 5: Database Updates""" num_queries = get_num_queries() ids = generate_ids(num_queries) ids.sort() worlds = [] with orm.db_session(serializable=False): for ident in ids: world = World[ident] world.randomNumber = randint(1, 10000) worlds.append({"id": world.id, "randomNumber": world.randomNumber}) return jsonify(worlds) @app.route('/plaintext') def plaintext(): """Test 6: Plaintext""" response = make_response(b'Hello, World!') response.content_type = 'text/plain' return response try: import meinheld meinheld.server.set_access_logger(None) meinheld.set_keepalive(120) except ImportError: pass # entry point for debugging if __name__ == "__main__": app.run(debug=True)