diff --git a/chat/app.py b/chat/app.py index 0296ea2..2416eec 100644 --- a/chat/app.py +++ b/chat/app.py @@ -20,6 +20,7 @@ class Application(web.Application): class MainHandler(web.RequestHandler): + def get(self): self.render("index.html") @@ -46,5 +47,6 @@ def main(): ioloop.IOLoop.current().start() + if __name__ == '__main__': main() diff --git a/chat/app2.py b/chat/app2.py index 2859b39..96ede4c 100644 --- a/chat/app2.py +++ b/chat/app2.py @@ -1,19 +1,102 @@ import logging import datetime +import os.path from redis import StrictRedis -from tornado import web, websocket, escape +from tornado import web, websocket, escape, options, locale, ioloop +from tornado.httpserver import HTTPServer r = StrictRedis(db=1) logger = logging.getLogger('handlers') +settings = { + 'cookie_secret': '__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__', + 'template_path': os.path.join(os.path.dirname(__file__), 'templates'), + 'static_path': os.path.join(os.path.dirname(__file__), 'static'), + 'login_url': '/login', + 'xsrf_cookies': True, + 'debug': True, + 'autoreload': True, + 'server_traceback': True, +} -class ChatHandler(websocket.WebSocketHandler): + +class Application(web.Application): + def __init__(self): + handlers = [ + (r"/",ChannelHandler), + (r"/chatsocket/(?P\w+)/", ChatSocketHandler) + ] + super().__init__(handlers=handlers, **settings) + + +class ChannelHandler(web.RequestHandler): + def get(self, *args, **kwargs): + title = kwargs.get('channel', 'main') + self.chnl = kwargs.get('channel', 'main') + cache = r.lrange('channels:{}'.format(title), 0, -1) + messages =(escape.json_decode(x) for x in cache) if cache else [] + print(messages) + + self.render('index2.html',messages=messages) + + +class ChatSocketHandler(websocket.WebSocketHandler): waiters = set() def open(self, *args, **kwargs): self.chnl = kwargs.get('channel', 'main') - self.waiters.add((self.chn1, self)) - self.chnl_key = 'channels:{}' + self.waiters.add((self.chnl, self)) + # self.chnl_key = 'channels:{}:users'.format(self.chnl) + # count = int(r.zcard(self.chnl_key)) + # r.zadd(self.chnl_key, count+1, "mukhtar") + # users = r.zrange(self.chnl_key,0,-1) + # self.send_updates() + + def on_close(self): + self.waiters.remove(self.chnl, self) + + def on_message(self, message): + parsed = escape.json_decode(message) + if 'dummy' in parsed: + return + + chat = { + 'parent': 'inbox', + 'body': parsed['message'], + 'user': 'Mukhtar', + 'time': datetime.datetime.now().strftime('%H:%M:%S %Y-%m-%d') + } + self.update_channel_history(chat) + self.send_updates(parsed); + + def update_channel_history(self,chat): + chnl = 'channels:{}'.format(self.chnl) + r.rpush(chnl, escape.json_encode(chat)) + r.ltrim(chnl, -25, -1) + + def send_updates(self, chat): + chnl_waiters = tuple(w for c, w in self.waiters) + for waiter in chnl_waiters: + try: + waiter.write_message(chat) + except: + pass + + def __del__(self): + r.zrem(self.chnl_key, self.current_user) + self.log('PUSHED OUT') + + +def main(): + options.parse_command_line() + app = Application() + server = HTTPServer(app) + server.listen(8888) + loop = ioloop.IOLoop.current() + loop.start() + +if __name__ == '__main__': + main() diff --git a/chat/templates/index.html b/chat/templates/index.html new file mode 100644 index 0000000..e5a460a --- /dev/null +++ b/chat/templates/index.html @@ -0,0 +1,42 @@ + + + + + Title + + +

Всем привет , дети мои!!

+
+
+ +
+ + +
+ + + + diff --git a/chat/templates/index2.html b/chat/templates/index2.html new file mode 100644 index 0000000..395bf1a --- /dev/null +++ b/chat/templates/index2.html @@ -0,0 +1,61 @@ + + + + + Title + + +

Chat

+
+{% for message in messages %} +

{{ message["body"] }}

+

{{ message["time"] }}

+ {% end%} +
+
+ + +
+ + + diff --git a/chat/testapp.py b/chat/testapp.py new file mode 100644 index 0000000..b89c0d8 --- /dev/null +++ b/chat/testapp.py @@ -0,0 +1,6 @@ +import psycopg2 +conn = psycopg2.connect(database="archilance", user="postgres", password="postgres", host="localhost") +cursor = conn.cursor() +cursor.execute("SELECT 1") +rows = cursor.fetchall() +print(rows)