app.py 2.7 KB

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