Skip to content

Commit a7cd959

Browse files
author
zeekay
committed
Chatty chat example.
1 parent 1f4cf04 commit a7cd959

File tree

3 files changed

+115
-7
lines changed

3 files changed

+115
-7
lines changed

examples/chatty-gevent/chatty.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#!/usr/bin/env python
2+
from flask import Flask, render_template
3+
from flask.ext.uwsgi_websocket import GeventWebSocket
4+
from gevent import sleep
5+
6+
app = Flask(__name__)
7+
ws = GeventWebSocket(app)
8+
9+
@app.route('/')
10+
def index():
11+
return render_template('index.html')
12+
13+
users = {}
14+
15+
@ws.route('/websocket')
16+
def sender(ws):
17+
users[ws.id] = ws
18+
19+
while True:
20+
for id in users:
21+
if id != ws.id:
22+
users[id].send('hi from ' + ws.id)
23+
sleep(3)
24+
25+
if __name__ == '__main__':
26+
app.run(debug=True, gevent=100)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<!doctype html>
2+
<head>
3+
<meta charset="utf-8" />
4+
<title>WebSocket Chat</title>
5+
6+
<style>
7+
li { list-style: none; }
8+
</style>
9+
10+
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
11+
<script>
12+
$(document).ready(function() {
13+
if (!window.WebSocket) {
14+
if (window.MozWebSocket) {
15+
window.WebSocket = window.MozWebSocket;
16+
} else {
17+
$('#messages').append("<li>Your browser doesn't support WebSockets.</li>");
18+
}
19+
}
20+
ws = new WebSocket('ws://127.0.0.1:5000/websocket');
21+
ws.onopen = function(evt) {
22+
$('#messages').append('<li>Connected to chat.</li>');
23+
}
24+
ws.onmessage = function(evt) {
25+
$('#messages').append('<li>' + evt.data + '</li>');
26+
}
27+
$('#send-message').submit(function() {
28+
ws.send($('#name').val() + ": " + $('#message').val());
29+
$('#message').val('').focus();
30+
return false;
31+
});
32+
});
33+
</script>
34+
</head>
35+
<body>
36+
<h2>WebSocket Chat Example</h2>
37+
<form id="send-message">
38+
<input id="name" type="text" value="name">
39+
<input id="message" type="text" value="message" />
40+
<input type="submit" value="Send" />
41+
</form>
42+
<div id="messages"></div>
43+
</body>
44+
</html>

flask_uwsgi_websocket/_gevent.py

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,58 @@
1+
from gevent import sleep, spawn
2+
from gevent.select import select
3+
from gevent.queue import Queue
4+
import uuid
5+
16
from . import WebSocket, WebSocketClient, WebSocketMiddleware
27
from ._uwsgi import uwsgi
3-
import gevent.select
48

59

6-
class GeventWebSocketClient(WebSocketClient):
10+
class GeventWebSocketClient(object):
11+
def __init__(self, queue):
12+
self.id = str(uuid.uuid1())
13+
self.queue = queue
14+
15+
def send(self, message):
16+
self.queue.put(message)
17+
718
def receive(self):
8-
ready = gevent.select.select([self.fd], [], [], self.timeout)
9-
try:
10-
return uwsgi.websocket_recv_nb()
11-
except IOError: # client disconnected
12-
pass
19+
pass
1320

1421

1522
class GeventWebSocketMiddleware(WebSocketMiddleware):
1623
client = GeventWebSocketClient
1724

25+
def __call__(self, environ, start_response):
26+
handler = self.websocket.routes.get(environ['PATH_INFO'])
27+
28+
if not handler:
29+
return self.wsgi_app(environ, start_response)
30+
31+
# do handshake
32+
uwsgi.websocket_handshake(environ['HTTP_SEC_WEBSOCKET_KEY'], environ.get('HTTP_ORIGIN', ''))
33+
34+
35+
queue = Queue()
36+
37+
# spawn greenlet for handler
38+
spawn(handler, self.client(queue))
39+
40+
# loop waiting for messages to send
41+
while True:
42+
message = queue.get()
43+
if message:
44+
uwsgi.websocket_send(message)
45+
sleep(0)
46+
47+
# loop here and handle send/recieves to client in other greenlet?
48+
# fd = uwsgi.connection_fd()
49+
# while True:
50+
# ready = gevent.select.select([fd], [], [], self.websocket.timeout)
51+
# try:
52+
# return uwsgi.websocket_recv_nb()
53+
# except IOError: # client disconnected
54+
# pass
55+
1856

1957
class GeventWebSocket(WebSocket):
2058
middleware = GeventWebSocketMiddleware

0 commit comments

Comments
 (0)