server_py2.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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 import gen
  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. @gen.coroutine
  16. def get(self):
  17. world = yield 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. @gen.coroutine
  25. def get(self):
  26. try:
  27. queries = int(self.get_argument(self.QUERIES))
  28. except Exception:
  29. queries = 1
  30. else:
  31. if queries < 1:
  32. queries = 1
  33. elif queries > 500:
  34. queries = 500
  35. worlds = yield [db.world.find_one(randint(1, 10000)) for _ in xrange(queries)]
  36. worlds = [{self.ID: int(world['_id']),
  37. self.RANDOM_NUMBER: int(world[self.RANDOM_NUMBER])}
  38. for world in worlds]
  39. self.finish(json.dumps(worlds))
  40. class UpdateHandler(JsonHandler):
  41. @gen.coroutine
  42. def get(self):
  43. try:
  44. queries = int(self.get_argument(self.QUERIES))
  45. except Exception:
  46. queries = 1
  47. else:
  48. if queries < 1:
  49. queries = 1
  50. elif queries > 500:
  51. queries = 500
  52. worlds = []
  53. updates = []
  54. for _ in xrange(queries):
  55. world = yield db.world.find_one(randint(1, 10000))
  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: world['_id'],
  59. self.RANDOM_NUMBER: world[self.RANDOM_NUMBER]})
  60. yield updates
  61. self.finish(json.dumps(worlds))
  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. if __name__ == "__main__":
  83. tornado.options.parse_command_line()
  84. server = tornado.httpserver.HTTPServer(application)
  85. server.bind(options.port, backlog=options.backlog)
  86. server.start(0)
  87. ioloop = tornado.ioloop.IOLoop.instance()
  88. db = motor.MotorClient(options.mongo).hello_world
  89. ioloop.start()