#ARC-16 add redis in tornado chat app

remotes/origin/setup
Mukhtar 10 years ago
parent 66d1e863fa
commit d97543382e
  1. 2
      chat/app.py
  2. 91
      chat/app2.py
  3. 42
      chat/templates/index.html
  4. 61
      chat/templates/index2.html
  5. 6
      chat/testapp.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()

@ -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<channel>\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()

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Всем привет , дети мои!!</h1>
<div id="output">
</div>
<form id="chatform">
<input id="text" type="text" />
<input type="submit" />
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var url = 'ws://127.0.0.1:8888/chat';
var socket = new WebSocket(url);
socket.onopen = function(){
console.log("Соединение установлено");
socket.send("start");
}
socket.onmessage = function (event) {
console.log(event.data);
var data = JSON.parse(event.data);
output = output + '<h3>'+ data.msg +'</h3>';
$("#output").html(output);
}
$('form').submit(function(e){
e.preventDefault();
var currentText = $("#text").val();
socket.send(currentText);
});
});
</script>
</body>
</html>

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Chat</h1>
<div id="inbox">
{% for message in messages %}
<h1>{{ message["body"] }}</h1>
<h3>{{ message["time"] }} </h3>
{% end%}
</div>
<form method="post" id="messageform">
<textarea id="message" name="message"></textarea>
<input type="submit" />
</form>
<script type="text/javascript">
window.onload = function(){
var socket = new SocketHandler();
var form = document.getElementById('messageform');
form.onsubmit = function(e){
e.preventDefault();
console.log('submit click');
socket.send_message(form);
}
};
var SocketHandler = function(){
var url = 'ws://' + location.host + '/chatsocket/main/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function(){
console.log("Start connect");
intervalId = setInterval(function(){sock.send('{"dummy": 1}');}, 150000);
};
sock.onmessage = function(event){
console.log(event.data);
message = JSON.parse(event.data);
var inbox = document.getElementById('inbox');
inbox.innerHTML += '<h2>' + message.message + '</h2>';
};
this.send_message = function(form){
var elements = form.elements;
var data = {};
var i=0;
for(var i; i< elements.length; i++){
if (elements[i].name == 'message') {
data[elements[i].name] = elements[i].value;
}
}
sock.send(JSON.stringify(data));
}
}
</script>
</body>
</html>

@ -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)
Loading…
Cancel
Save