server_py3.py 3.2 KB

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