server.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #!/usr/bin/env python3
  2. import json
  3. from lesscss import lessc
  4. import tornado.gen
  5. import tornado.httpclient
  6. import tornado.ioloop
  7. import tornado.web
  8. import operator
  9. import os
  10. import config
  11. class BaseHandler(tornado.web.RequestHandler):
  12. def render(self, *args, **kwargs):
  13. kwargs['host'] = config.web.host
  14. return super(BaseHandler, self).render(*args, **kwargs)
  15. def render_string(self, *args, **kwargs):
  16. s = super(BaseHandler, self).render_string(*args, **kwargs)
  17. return s.replace(b'\n', b'') # this is like Django's {% spaceless %}
  18. class MainHandler(BaseHandler):
  19. @tornado.web.asynchronous
  20. @tornado.gen.coroutine
  21. def get(self):
  22. http_client = tornado.httpclient.AsyncHTTPClient()
  23. kills_url = 'https://zkillboard.com/api/kills/corporationID/98182803/limit/1'
  24. losses_url = 'https://zkillboard.com/api/losses/corporationID/98182803/limit/1'
  25. kills_res, losses_res = yield [http_client.fetch(kills_url), http_client.fetch(losses_url)]
  26. kills = json.loads(kills_res.body.decode('utf-8'))
  27. losses = json.loads(losses_res.body.decode('utf-8'))
  28. kills = sorted(kills + losses, key=operator.itemgetter('killTime'), reverse=True)
  29. self.render('home.html', kills=kills)
  30. class CSSHandler(tornado.web.RequestHandler):
  31. def get(self, css_path):
  32. css_path = os.path.join(os.path.dirname(__file__), 'static', css_path) + '.less'
  33. with open(css_path, 'r') as f:
  34. self.set_header('Content-Type', 'text/css')
  35. css = lessc.compile(f.read())
  36. self.write(css)
  37. if __name__ == '__main__':
  38. tornado.web.Application(
  39. handlers=[
  40. (r'/', MainHandler),
  41. (r"/(css/.+)\.css", CSSHandler),
  42. ],
  43. template_path=os.path.join(os.path.dirname(__file__), 'templates'),
  44. static_path=os.path.join(os.path.dirname(__file__), 'static'),
  45. cookie_secret=config.web.cookie_secret,
  46. debug=True,
  47. ).listen(config.web.port)
  48. print('Listening on :%d' % config.web.port)
  49. tornado.ioloop.IOLoop.instance().start()