server_py3.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #!/usr/bin/env python
  2. import asyncio
  3. import ujson as json
  4. import motor
  5. import uvloop
  6. import tornado.ioloop
  7. import tornado.web
  8. import tornado.httpserver
  9. from random import randint
  10. from tornado.options import options
  11. from commons import JsonHandler, JsonHelloWorldHandler, PlaintextHelloWorldHandler, HtmlHandler
  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. 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. if queries < 1:
  47. queries = 1
  48. elif queries > 500:
  49. queries = 500
  50. worlds = []
  51. updates = []
  52. futures, _ = await asyncio.wait([db.world.find_one(randint(1, 10000)) for _ in range(queries)])
  53. for future in futures:
  54. world = future.result()
  55. new_value = randint(1, 10000)
  56. updates.append(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. await asyncio.wait(updates)
  60. self.finish(json.dumps(worlds))
  61. class FortuneHandler(HtmlHandler):
  62. async def get(self):
  63. fortunes = [fortune async for fortune in db.fortune.find()]
  64. fortunes.append({'id': 0, 'message': 'Additional fortune added at request time.'})
  65. fortunes.sort(key=lambda f: f['message'])
  66. self.render('fortunes.html', fortunes=fortunes)
  67. application = tornado.web.Application([
  68. (r"/json", JsonHelloWorldHandler),
  69. (r"/plaintext", PlaintextHelloWorldHandler),
  70. (r"/db", SingleQueryHandler),
  71. (r"/queries", MultipleQueriesHandler),
  72. (r"/updates", UpdateHandler),
  73. (r"/fortunes", FortuneHandler),
  74. ],
  75. template_path="templates"
  76. )
  77. application.ui_modules = {}
  78. if __name__ == "__main__":
  79. uvloop.install()
  80. tornado.options.parse_command_line()
  81. server = tornado.httpserver.HTTPServer(application)
  82. server.bind(options.port, backlog=options.backlog, reuse_port=True)
  83. server.start(0)
  84. ioloop = tornado.ioloop.IOLoop.instance()
  85. db = motor.MotorClient(options.mongo, maxPoolSize=500).hello_world
  86. ioloop.start()