app.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import sys
  2. from functools import partial
  3. from random import randint
  4. from weppy import App, Pipe, request, response
  5. from weppy.orm import Database, Model, Field, rowmethod
  6. from weppy.tools import service
  7. from email.utils import formatdate
  8. _is_pypy = hasattr(sys, 'pypy_version_info')
  9. if sys.version_info[0] == 3:
  10. xrange = range
  11. DBHOSTNAME = 'tfb-database'
  12. app = App(__name__)
  13. class World(Model):
  14. tablename = "world"
  15. randomnumber = Field.int()
  16. @rowmethod('serialize')
  17. def _serialize(self, row):
  18. return {'id': row.id, 'randomNumber': row.randomnumber}
  19. class Fortune(Model):
  20. tablename = "fortune"
  21. message = Field.string()
  22. @rowmethod('serialize')
  23. def _serialize(self, row):
  24. return {'id': row.id, 'message': row.message}
  25. class DateHeaderPipe(Pipe):
  26. def open(self):
  27. response.headers["Date"] = formatdate(timeval=None, localtime=False, usegmt=True)
  28. app.config.handle_static = False
  29. app.config.db.adapter = 'postgres:psycopg2' \
  30. if not _is_pypy else 'postgres:pg8000'
  31. app.config.db.host = DBHOSTNAME
  32. app.config.db.user = 'benchmarkdbuser'
  33. app.config.db.password = 'benchmarkdbpass'
  34. app.config.db.database = 'hello_world'
  35. app.config.db.pool_size = 100
  36. app.pipeline = [DateHeaderPipe()]
  37. db = Database(app, auto_migrate=False)
  38. db.define_models(World, Fortune)
  39. @app.route()
  40. @service.json
  41. def json():
  42. return {'message': 'Hello, World!'}
  43. @app.route("/db", pipeline=[db.pipe])
  44. @service.json
  45. def get_random_world():
  46. return World.get(randint(1, 10000)).serialize()
  47. def get_qparam():
  48. try:
  49. rv = int(request.query_params.queries)
  50. if rv < 1:
  51. rv = 1
  52. if rv > 500:
  53. rv = 500
  54. except:
  55. rv = 1
  56. return rv
  57. @app.route("/queries", pipeline=[db.pipe])
  58. @service.json
  59. def get_random_worlds():
  60. num_queries = get_qparam()
  61. worlds = [
  62. World.get(randint(1, 10000)).serialize() for _ in xrange(num_queries)]
  63. return worlds
  64. @app.route(pipeline=[db.pipe])
  65. def fortunes():
  66. fortunes = Fortune.all().select()
  67. fortunes.append(
  68. Fortune.new(id=0, message="Additional fortune added at request time."))
  69. fortunes.sort(lambda m: m.message)
  70. return {'fortunes': fortunes}
  71. @app.route(pipeline=[db.pipe])
  72. @service.json
  73. def updates():
  74. num_queries = get_qparam()
  75. worlds = []
  76. rp = partial(randint, 1, 10000)
  77. ids = [rp() for _ in xrange(num_queries)]
  78. ids.sort() # To avoid deadlock
  79. for id in ids:
  80. world = World.get(id)
  81. world.update_record(randomnumber=rp())
  82. worlds.append(world.serialize())
  83. return worlds
  84. @app.route()
  85. def plaintext():
  86. response.headers["Content-Type"] = "text/plain"
  87. return 'Hello, World!'
  88. try:
  89. import meinheld
  90. meinheld.server.set_access_logger(None)
  91. meinheld.set_keepalive(120)
  92. except ImportError:
  93. pass
  94. # entry point for debugging
  95. if __name__ == "__main__":
  96. app.run(debug=True)