app.py 4.1 KB

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