123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #!/usr/bin/env python
- from collections import namedtuple
- from operator import attrgetter, itemgetter
- from random import randint
- import sys
- from flask import Flask, request, render_template, make_response, jsonify
- if sys.version_info[0] == 3:
- xrange = range
- _is_pypy = hasattr(sys, 'pypy_version_info')
- if _is_pypy:
- from psycopg2cffi.pool import ThreadedConnectionPool
- else:
- from psycopg2.pool import ThreadedConnectionPool
- # setup
- app = Flask(__name__)
- pool = ThreadedConnectionPool(minconn=2, maxconn=2, database="hello_world", user="benchmarkdbuser", password="benchmarkdbpass", host="tfb-database", port=5432)
- READ_ROW_SQL = 'SELECT world."randomnumber", world."id" FROM "world" WHERE id = %(id)s'
- WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=%(randomNumber)s WHERE id=%(id)s'
- 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():
- db = pool.getconn()
- cursor = db.cursor()
- def query(ident):
- cursor.execute(READ_ROW_SQL, {"id": ident})
- result = cursor.fetchone()
- return result
- worlds = [{'id': result[0], 'randomNumber': result[1]} for result in map(query, generate_ids(get_num_queries()))]
- pool.putconn(db)
- return jsonify(worlds)
- @app.route("/db")
- def get_random_world_single():
- db = pool.getconn()
- cursor = db.cursor()
- cursor.execute(READ_ROW_SQL, {"id": randint(1, 10000)})
- result = cursor.fetchone()
- world = {'id': result[0], 'randomNumber': result[1]}
- pool.putconn(db)
- return jsonify(world)
- Fortune = namedtuple("Fortune", ["id", "message"])
- @app.route("/fortunes")
- def get_fortunes():
- db = pool.getconn()
- cursor = db.cursor()
- cursor.execute('SELECT * FROM "Fortune"')
- fortunes = [Fortune(id=row[0], message=row[1]) for row in cursor.fetchall()]
- fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
- fortunes.sort(key=attrgetter('message'))
- pool.putconn(db)
- return render_template('fortunes.html', fortunes=fortunes)
- @app.route("/updates")
- def updates():
- """Test 5: Database Updates"""
- db = pool.getconn()
- cursor = db.cursor()
- num_queries = get_num_queries()
- ids = generate_ids(num_queries)
- updates = generate_ids(num_queries)
- def query(ident):
- cursor.execute(READ_ROW_SQL, {"id": ident})
- result = cursor.fetchone()
- return result
- list(map(query, generate_ids(get_num_queries())))
- worlds = [{"id": ident, "randomNumber": update} for ident, update in zip(ids, updates)]
- for world in worlds:
- cursor.execute(WRITE_ROW_SQL, world)
- db.commit()
- pool.putconn(db)
- 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)
|