app.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import cgi
  2. import os
  3. import sys
  4. from functools import partial
  5. from random import randint
  6. from weppy import App, request, response
  7. from weppy.dal import Model, Field, DAL, rowmethod
  8. from weppy.tools import service
  9. _is_pypy = hasattr(sys, 'pypy_version_info')
  10. if sys.version_info[0] == 3:
  11. xrange = range
  12. # NOTE on html escaping: weppy normally escapes every character to its ascii
  13. # html representation. The 'fortunes' test seems not to like that, so we
  14. # re-define the escaping only to the next characters
  15. # _html_escape_table = {
  16. # "&": "&",
  17. # '"': """,
  18. # "'": "'",
  19. # ">": ">",
  20. # "<": "&lt;",
  21. # }
  22. def light_html_escape(text):
  23. # return "".join(_html_escape_table.get(c, c) for c in text)
  24. return cgi.escape(text, True).replace("'", "&#x27;")
  25. DBHOSTNAME = os.environ.get('DBHOST', 'localhost')
  26. app = App(__name__)
  27. class World(Model):
  28. tablename = "world"
  29. randomnumber = Field('int')
  30. @rowmethod('serialize')
  31. def _serialize(self, row):
  32. return {'id': row.id, 'randomNumber': row.randomnumber}
  33. class Fortune(Model):
  34. tablename = "fortune"
  35. message = Field()
  36. @rowmethod('serialize')
  37. def _serialize(self, row):
  38. return {'id': row.id, 'message': row.message}
  39. app.config.db.adapter = 'postgres:psycopg2' \
  40. if not _is_pypy else 'postgres:pg8000'
  41. app.config.db.host = DBHOSTNAME
  42. app.config.db.user = 'benchmarkdbuser'
  43. app.config.db.password = 'benchmarkdbpass'
  44. app.config.db.database = 'hello_world'
  45. app.config.db.pool_size = 100
  46. db = DAL(app, auto_migrate=False)
  47. db.define_models(World, Fortune)
  48. @app.route()
  49. @service.json
  50. def json():
  51. return {'message': 'Hello, World!'}
  52. @app.route("/db", handlers=[db.handler])
  53. @service.json
  54. def get_random_world():
  55. return World.get(randint(1, 10000)).serialize()
  56. def get_qparam():
  57. try:
  58. rv = int(request.query_params.queries)
  59. if rv < 1:
  60. rv = 1
  61. if rv > 500:
  62. rv = 500
  63. except:
  64. rv = 1
  65. return rv
  66. @app.route("/queries", handlers=[db.handler])
  67. @service.json
  68. def get_random_worlds():
  69. num_queries = get_qparam()
  70. worlds = [
  71. World.get(randint(1, 10000)).serialize() for _ in xrange(num_queries)]
  72. return worlds
  73. @app.route(handlers=[db.handler])
  74. def fortunes():
  75. fortunes = Fortune.all().select()
  76. fortunes.append(
  77. Fortune.new(id=0, message="Additional fortune added at request time."))
  78. fortunes.sort(lambda m: m.message)
  79. return dict(fortunes=fortunes, escape=light_html_escape)
  80. @app.route(handlers=[db.handler])
  81. @service.json
  82. def updates():
  83. num_queries = get_qparam()
  84. worlds = []
  85. rp = partial(randint, 1, 10000)
  86. ids = [rp() for _ in xrange(num_queries)]
  87. ids.sort() # To avoid deadlock
  88. for id in ids:
  89. world = World.get(id)
  90. world.update_record(randomnumber=rp())
  91. worlds.append(world.serialize())
  92. return worlds
  93. @app.route()
  94. def plaintext():
  95. response.headers["Content-Type"] = "text/plain"
  96. return 'Hello, World!'
  97. try:
  98. import meinheld
  99. meinheld.server.set_access_logger(None)
  100. meinheld.set_keepalive(120)
  101. except ImportError:
  102. pass
  103. # entry point for debugging
  104. if __name__ == "__main__":
  105. app.run(debug=True)