server.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #!/usr/bin/env python3
  2. import os
  3. import urllib.parse
  4. import cleancss
  5. import tornado.gen
  6. import tornado.escape
  7. import tornado.httpclient
  8. import tornado.ioloop
  9. import tornado.web
  10. from config import web as config
  11. import db
  12. class BaseHandler(tornado.web.RequestHandler):
  13. def render(self, *args, **kwargs):
  14. kwargs['host'] = config.host
  15. return super(BaseHandler, self).render(*args, **kwargs)
  16. def render_string(self, *args, **kwargs):
  17. s = super(BaseHandler, self).render_string(*args, **kwargs)
  18. return s.replace(b'\n', b'') # this is like Django's {% spaceless %}
  19. def get_current_user(self):
  20. user_id = self.get_secure_cookie('user_id')
  21. if user_id:
  22. return {
  23. 'id': int(user_id),
  24. 'username': self.get_secure_cookie('username'),
  25. }
  26. def create_session(self, user_id, username):
  27. self.set_secure_cookie('user_id', str(user_id))
  28. self.set_secure_cookie('username', username)
  29. @property
  30. def db(self):
  31. return self.application.db
  32. class MainHandler(BaseHandler):
  33. @tornado.gen.coroutine
  34. def get(self):
  35. groups = None
  36. if self.current_user:
  37. groups = yield self.db.get_groups(self.current_user['id'])
  38. self.render('home.html', groups=groups)
  39. class RegisterHandler(BaseHandler):
  40. @tornado.gen.coroutine
  41. def get(self):
  42. self.render('register.html')
  43. @tornado.gen.coroutine
  44. def post(self):
  45. username = self.get_argument('username', '')
  46. password = self.get_argument('password', '')
  47. user_id = yield self.db.create_user(username, password)
  48. self.create_session(user_id, username)
  49. self.redirect('/')
  50. class LoginHandler(BaseHandler):
  51. @tornado.gen.coroutine
  52. def get(self):
  53. self.render('login.html')
  54. @tornado.gen.coroutine
  55. def post(self):
  56. username = self.get_argument('username', '')
  57. password = self.get_argument('password', '')
  58. user = yield self.db.check_user(username, password)
  59. if user:
  60. self.create_session(user['id'], user['username'])
  61. self.redirect('/')
  62. else:
  63. self.render('login.html')
  64. class LogoutHandler(BaseHandler):
  65. def get(self):
  66. self.clear_all_cookies()
  67. self.redirect('/')
  68. class StatsHandler(BaseHandler):
  69. @tornado.gen.coroutine
  70. def get(self):
  71. self.render('stats.html')
  72. class GroupCreateHandler(BaseHandler):
  73. @tornado.gen.coroutine
  74. def post(self):
  75. yield self.db.create_group(self.current_user['id'], self.get_body_argument('name'))
  76. self.redirect('/')
  77. class CSSHandler(tornado.web.RequestHandler):
  78. def get(self, css_path):
  79. css_path = os.path.join(os.path.dirname(__file__), 'static', css_path) + '.ccss'
  80. with open(css_path, 'r') as f:
  81. self.set_header('Content-Type', 'text/css')
  82. self.write(cleancss.convert(f))
  83. if __name__ == '__main__':
  84. app = tornado.web.Application(
  85. handlers=[
  86. (r'/', MainHandler),
  87. (r'/register', RegisterHandler),
  88. (r'/login', LoginHandler),
  89. (r'/logout', LogoutHandler),
  90. (r'/stats', StatsHandler),
  91. (r'/groups/create', GroupCreateHandler),
  92. (r'/(css/.+)\.css', CSSHandler),
  93. ],
  94. template_path=os.path.join(os.path.dirname(__file__), 'templates'),
  95. static_path=os.path.join(os.path.dirname(__file__), 'static'),
  96. login_url='/login',
  97. cookie_secret=config.cookie_secret,
  98. debug=config.debug,
  99. )
  100. app.listen(config.port)
  101. app.db = db.MomokoDB()
  102. print('listening on :%d' % config.port)
  103. tornado.ioloop.IOLoop.instance().start()