server_py3.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #!/usr/bin/env python
  2. import asyncio
  3. import json
  4. import motor
  5. import tornado.ioloop
  6. import tornado.web
  7. import tornado.httpserver
  8. from random import randint
  9. from tornado.options import options
  10. from commons import JsonHandler, JsonHelloWorldHandler, PlaintextHelloWorldHandler, HtmlHandler
  11. options.define('port', default=8888, type=int, help="Server port")
  12. options.define('mongo', default='localhost', type=str, help="MongoDB host")
  13. options.define('backlog', default=8192, type=int, help="Server backlog")
  14. class SingleQueryHandler(JsonHandler):
  15. async def get(self):
  16. world = await db.world.find_one(randint(1, 10000))
  17. world = {self.ID: int(world['_id']),
  18. self.RANDOM_NUMBER: int(world[self.RANDOM_NUMBER])
  19. }
  20. response = json.dumps(world)
  21. self.finish(response)
  22. class MultipleQueriesHandler(JsonHandler):
  23. async def get(self):
  24. try:
  25. queries = int(self.get_argument(self.QUERIES))
  26. except Exception:
  27. queries = 1
  28. else:
  29. if queries < 1:
  30. queries = 1
  31. elif queries > 500:
  32. queries = 500
  33. worlds = []
  34. futures, _ = await asyncio.wait([db.world.find_one(randint(1, 10000)) for _ in range(queries)])
  35. for future in futures:
  36. world = future.result()
  37. worlds.append({self.ID: int(world['_id']),
  38. self.RANDOM_NUMBER: int(world[self.RANDOM_NUMBER])})
  39. self.finish(json.dumps(worlds))
  40. class UpdateHandler(JsonHandler):
  41. async def get(self):
  42. try:
  43. queries = int(self.get_argument(self.QUERIES))
  44. except Exception:
  45. queries = 1
  46. else:
  47. if queries < 1:
  48. queries = 1
  49. elif queries > 500:
  50. queries = 500
  51. worlds = []
  52. updates = []
  53. futures, _ = await asyncio.wait([db.world.find_one(randint(1, 10000)) for _ in range(queries)])
  54. for future in futures:
  55. world = future.result()
  56. new_value = randint(1, 10000)
  57. updates.append(db.world.update_one({'_id': world['_id']}, {"$set": {self.RANDOM_NUMBER: new_value}}))
  58. worlds.append({self.ID: int(world['_id']),
  59. self.RANDOM_NUMBER: world[self.RANDOM_NUMBER]})
  60. await asyncio.wait(updates)
  61. self.finish(json.dumps(worlds))
  62. class FortuneHandler(HtmlHandler):
  63. async def get(self):
  64. fortunes = []
  65. async for fortune in db.fortune.find():
  66. fortunes.append(fortune)
  67. fortunes.append({self.ID: 0, 'message': 'Additional fortune added at request time.'})
  68. fortunes.sort(key=lambda f: f['message'])
  69. self.render('fortunes.html', fortunes=fortunes)
  70. application = tornado.web.Application([
  71. (r"/json", JsonHelloWorldHandler),
  72. (r"/plaintext", PlaintextHelloWorldHandler),
  73. (r"/db", SingleQueryHandler),
  74. (r"/queries", MultipleQueriesHandler),
  75. (r"/updates", UpdateHandler),
  76. (r"/fortunes", FortuneHandler),
  77. ],
  78. template_path="templates"
  79. )
  80. application.ui_modules = {}
  81. if __name__ == "__main__":
  82. tornado.options.parse_command_line()
  83. server = tornado.httpserver.HTTPServer(application)
  84. server.bind(options.port, backlog=options.backlog)
  85. server.start(0)
  86. ioloop = tornado.ioloop.IOLoop.instance()
  87. db = motor.MotorClient(options.mongo, maxPoolSize=500).hello_world
  88. ioloop.start()