How to use Flask-Sockets? Getting a KeyError: 'wsgi.websocket'

flask, flask-sockets, python, sockets, websocket

Solution

Ah, thats the problem, you cant just visit the websocket endpoint with regular GET request, that way the `wsgi.websocket` will not be set to environ.

Also use gunicorn not the dev server, it comes with preconfigured worker:

# install from pip
pip install gunicorn

# run app located in test.py module (in test.py directory)
gunicorn -k flask_sockets.worker test:app

I made quick example here, be sure to update the address and port to match your setup.

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript">
       var ws = new WebSocket("ws://localhost:8000/echo");
       ws.onopen = function() {
           ws.send("socket open");
       };
       ws.onclose = function(evt) {
           alert("socket closed");
       };
    </script>
  </head>
</html>

That way the browser sends a request to the server, indicating that it wants to switch protocols from HTTP to WebSocket.

Feel free to read some more about websockets here:

- https://www.rfc-editor.org/rfc/rfc6455

- http://www.websocket.org/aboutwebsocket.html

Problem

I'm trying to use Flask-Sockets with the example code: ``` sockets = Sockets(app) @sockets.route('/echo') def echo_socket(ws): while True: message = ws.receive() ws.send(message) ``` Unfortunately, when simply going to the url /echo using my browser it gives me an error saying: ``` File "/Library/Python/2.7/site-packages/Flask-0.10-py2.7.egg/flask/app.py", line 1836, in __call__ return self.wsgi_app(environ, start_response) File "/Library/Python/2.7/site-packages/flask_sockets.py", line 37, in __call__ environment = environ['wsgi.websocket'] KeyError: 'wsgi.websocket' ``` Anybody any ideas what I'm doing wrong? All tips are welcome! [EDIT] @jbub - Thanks for the tips! So to start off I now use gunicorn instead of the built-in dev-server. So I started it using `gunicorn -k flask_sockets.worker -b 0.0.0.0:5000 main:app`. I then inserted the code below in my views.py i nwhich the echo_test.html is the code you supplied. When I now visit /echo_test, I indeed get a prompt saying "socket closed". ``` sockets = Sockets(app) @sockets.route('/echo') def echo_socket(ws): while True: message = ws.receive() ws.send(message) @app.route('/echo_test', methods=['GET']) def echo_test(): return render_template('echo_test.html') ``` But let's say my aim is to have a word (randomly chosen from a list) on a page which gets updated with other values randomly chosen from the list. Would you have any tips on achieving that?

Original source

Related problems