app.py 3.2 KB

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