public
Last active

Simple Websocket echo client/server with Flask and gevent / gevent-websocket

  • Download Gist
flask_geventwebsocket_example.py
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from flask import Flask, request, render_template
 
app = Flask(__name__)
 
@app.route('/')
def index():
return render_template('index.html')
 
@app.route('/api')
def api():
if request.environ.get('wsgi.websocket'):
ws = request.environ['wsgi.websocket']
while True:
message = ws.wait()
ws.send(message)
return
 
if __name__ == '__main__':
http_server = WSGIServer(('',5000), app, handler_class=WebSocketHandler)
http_server.serve_forever()
index.html
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
<!DOCTYPE HTML>
<html>
<head>
<title>Flask/Gevent WebSocket Test</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
<script type="text/javascript" charset="utf-8">
$(document).ready(function(){
$('form').submit(function(event){
ws.send($('#data').val())
return false;
});
if ("WebSocket" in window) {
ws = new WebSocket("ws://" + document.domain + ":5000/api");
ws.onmessage = function (msg) {
$("#log").append("<p>"+msg.data+"</p>")
};
} else {
alert("WebSocket not supported");
}
});
</script>
</head>
<body>
<h1>Send:</h1>
<form method='POST' action='#'>
<textarea name='data' id="data"></textarea>
<div><input type='submit'></div>
</form>
<h1>Receive:</h1>
<div id="log"></div>
</body>
</html>

Something that tripped me up:
Make sure to put the "index.html" file inside a folder called "templates". If you put it next to flask_geventwebsocket_example.py flask won't find it.

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.