server.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. return self.get_secure_cookie('username')
  21. @tornado.gen.coroutine
  22. def create_session(self, username):
  23. self.set_secure_cookie('username', username)
  24. @property
  25. def db(self):
  26. return self.application.db
  27. class MainHandler(BaseHandler):
  28. @tornado.gen.coroutine
  29. def get(self):
  30. self.render('home.html')
  31. class RegisterHandler(BaseHandler):
  32. @tornado.gen.coroutine
  33. def get(self):
  34. self.render('register.html')
  35. @tornado.gen.coroutine
  36. def post(self):
  37. username = self.get_argument("username", "")
  38. password = self.get_argument("password", "")
  39. yield self.db.create_user(username, password)
  40. self.create_session(username)
  41. self.redirect("/")
  42. class LoginHandler(BaseHandler):
  43. @tornado.gen.coroutine
  44. def get(self):
  45. self.render('login.html')
  46. @tornado.gen.coroutine
  47. def post(self):
  48. username = self.get_argument("username", "")
  49. password = self.get_argument("password", "")
  50. user = yield self.db.check_user(username, password)
  51. if not user:
  52. self.render("login.html")
  53. else:
  54. self.create_session(user['username'])
  55. self.redirect("/")
  56. class LogoutHandler(BaseHandler):
  57. def get(self):
  58. self.clear_all_cookies()
  59. self.redirect('/')
  60. class CSSHandler(tornado.web.RequestHandler):
  61. def get(self, css_path):
  62. css_path = os.path.join(os.path.dirname(__file__), 'static', css_path) + '.ccss'
  63. with open(css_path, 'r') as f:
  64. self.set_header('Content-Type', 'text/css')
  65. self.write(cleancss.convert(f))
  66. if __name__ == '__main__':
  67. app = tornado.web.Application(
  68. handlers=[
  69. (r'/', MainHandler),
  70. (r'/register', RegisterHandler),
  71. (r'/login', LoginHandler),
  72. (r'/logout', LogoutHandler),
  73. (r'/(css/.+)\.css', CSSHandler),
  74. ],
  75. template_path=os.path.join(os.path.dirname(__file__), 'templates'),
  76. static_path=os.path.join(os.path.dirname(__file__), 'static'),
  77. login_url='/login',
  78. cookie_secret=config.cookie_secret,
  79. debug=config.debug,
  80. )
  81. app.listen(config.port)
  82. app.db = db.MomokoDB()
  83. print('listening on :%d' % config.port)
  84. tornado.ioloop.IOLoop.instance().start()