server_py2.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #!/usr/bin/env python
  2. import json
  3. import motor
  4. from pymongo.operations import UpdateOne
  5. import tornado.ioloop
  6. import tornado.web
  7. import tornado.httpserver
  8. from random import randint
  9. from tornado import gen
  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. @gen.coroutine
  17. def get(self):
  18. world = yield db.world.find_one(randint(1, 10000))
  19. world = {self.ID: int(world['_id']),
  20. self.RANDOM_NUMBER: int(world[self.RANDOM_NUMBER])
  21. }
  22. response = json.dumps(world)
  23. self.finish(response)
  24. class MultipleQueriesHandler(JsonHandler):
  25. @gen.coroutine
  26. def get(self):
  27. try:
  28. queries = int(self.get_argument(self.QUERIES))
  29. except Exception:
  30. queries = 1
  31. else:
  32. if queries < 1:
  33. queries = 1
  34. elif queries > 500:
  35. queries = 500
  36. worlds = yield [db.world.find_one(randint(1, 10000)) for _ in xrange(queries)]
  37. worlds = [{self.ID: int(world['_id']),
  38. self.RANDOM_NUMBER: int(world[self.RANDOM_NUMBER])}
  39. for world in worlds]
  40. self.finish(json.dumps(worlds))
  41. class UpdateHandler(JsonHandler):
  42. @gen.coroutine
  43. def get(self):
  44. try:
  45. queries = int(self.get_argument(self.QUERIES))
  46. except Exception:
  47. queries = 1
  48. else:
  49. if queries < 1:
  50. queries = 1
  51. elif queries > 500:
  52. queries = 500
  53. worlds = yield [db.world.find_one(randint(1, 10000)) for _ in xrange(queries)]
  54. updates = []
  55. out = []
  56. for world in worlds:
  57. new_value = randint(1, 10000)
  58. updates.append(UpdateOne({'_id': world['_id']}, {"$set": {self.RANDOM_NUMBER: new_value}}))
  59. out.append({self.ID: world["_id"], self.RANDOM_NUMBER: new_value})
  60. yield db.world.bulk_write(updates, ordered=False)
  61. self.finish(json.dumps(out))
  62. class FortuneHandler(HtmlHandler):
  63. @gen.coroutine
  64. def get(self):
  65. fortunes = []
  66. cursor = db.fortune.find()
  67. while (yield cursor.fetch_next):
  68. fortunes.append(cursor.next_object())
  69. fortunes.append({self.ID: 0, 'message': 'Additional fortune added at request time.'})
  70. fortunes.sort(key=lambda f: f['message'])
  71. self.render('fortunes.html', fortunes=fortunes)
  72. application = tornado.web.Application([
  73. (r"/json", JsonHelloWorldHandler),
  74. (r"/plaintext", PlaintextHelloWorldHandler),
  75. (r"/db", SingleQueryHandler),
  76. (r"/queries", MultipleQueriesHandler),
  77. (r"/updates", UpdateHandler),
  78. (r"/fortunes", FortuneHandler),
  79. ],
  80. template_path="templates"
  81. )
  82. application.ui_modules = {}
  83. if __name__ == "__main__":
  84. tornado.options.parse_command_line()
  85. server = tornado.httpserver.HTTPServer(application)
  86. server.bind(options.port, backlog=options.backlog)
  87. server.start(0)
  88. ioloop = tornado.ioloop.IOLoop.instance()
  89. db = motor.MotorClient(options.mongo, maxPoolSize=500).hello_world
  90. ioloop.start()