app-backup.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import os
  2. import sys
  3. from functools import partial
  4. from operator import attrgetter
  5. from random import randint
  6. from wheezy.http import HTTPResponse
  7. from wheezy.http import WSGIApplication
  8. from wheezy.routing import url
  9. from wheezy.web.handlers import BaseHandler
  10. from wheezy.web.middleware import bootstrap_defaults
  11. from wheezy.web.middleware import path_routing_middleware_factory
  12. from sqlalchemy.ext.declarative import declarative_base
  13. from sqlalchemy import create_engine, Column
  14. from sqlalchemy.types import String, Integer
  15. from sqlalchemy.orm import sessionmaker
  16. DBDRIVER = 'mysql'
  17. DBHOSTNAME = os.environ.get('DBHOST', 'localhost')
  18. DATABASE_URI = '%s://benchmarkdbuser:benchmarkdbpass@%s:3306/hello_world?charset=utf8' % (DBDRIVER, DBHOSTNAME)
  19. Base = declarative_base()
  20. db_engine = create_engine(DATABASE_URI)
  21. Session = sessionmaker(bind=db_engine)
  22. db_session = Session()
  23. if sys.version_info[0] == 3:
  24. xrange = range
  25. def getQueryNum(queryString):
  26. try:
  27. int(queryString)
  28. return int(queryString)
  29. except ValueError:
  30. return 1
  31. class World(Base):
  32. __tablename__ = "World"
  33. id = Column(Integer, primary_key=True)
  34. randomNumber = Column(Integer)
  35. def serialize(self):
  36. return {
  37. 'id': self.id,
  38. 'randomNumber': self.randomNumber,
  39. }
  40. class JsonHandler(BaseHandler):
  41. def get(self):
  42. return self.json_response({"message": "Hello, world!"})
  43. class DbHandler(BaseHandler):
  44. def get(self):
  45. db_engine.connect()
  46. wid = randint(1, 10000)
  47. world = db_session.query(World).get(wid).serialize()
  48. return self.json_response(world)
  49. class QueriesHandler(BaseHandler):
  50. def get(self):
  51. queries = self.request.get_param("queries")
  52. num_queries = getQueryNum(queries)
  53. if num_queries < 1:
  54. num_queries = 1
  55. if num_queries > 500:
  56. num_queries = 500
  57. rp = partial(randint, 1, 10000)
  58. get = db_session.query(World).get
  59. worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
  60. return self.json_response(worlds)
  61. class UpdatesHandler(BaseHandler):
  62. def get(self):
  63. queries = self.request.get_param("queries")
  64. num_queries = getQueryNum(queries)
  65. if num_queries < 1:
  66. num_queries = 1
  67. if num_queries > 500:
  68. num_queries = 500
  69. worlds = []
  70. rp = partial(randint, 1, 10000)
  71. ids = [rp() for _ in xrange(num_queries)]
  72. ids.sort() # To avoid deadlock
  73. for id in ids:
  74. world = db_session.query(World).get(id)
  75. world.randomNumber = rp()
  76. worlds.append(world.serialize())
  77. return self.json_response(worlds)
  78. def plaintext(request):
  79. response = HTTPResponse()
  80. response.write("Hello, world!")
  81. return response
  82. all_urls = [
  83. url("plaintext", plaintext, name="plaintext"),
  84. url("json", JsonHandler, name="json"),
  85. url("db", DbHandler, name="db"),
  86. url("queries", QueriesHandler, name="queries"),
  87. url("updates", UpdatesHandler, name="updates")
  88. ]
  89. options = {}
  90. main = WSGIApplication(
  91. middleware = [
  92. bootstrap_defaults(url_mapping=all_urls),
  93. path_routing_middleware_factory
  94. ],
  95. options = options
  96. )
  97. if __name__ == "__main__":
  98. from wsgiref.simple_server import make_server
  99. try:
  100. print("Server started on http://localhost:8080")
  101. make_server("", 8080, main).serve_forever()
  102. except KeyboardInterrupt:
  103. pass
  104. print("\nStopping server...")