High-performance WebSockets for your Flask apps powered by uWSGI.
Project description
High-performance WebSockets for your Flask apps powered by uWSGI. Inspired by Flask-Sockets.
from flask import Flask
from flask.ext.uwsgi_websocket import WebSocket
app = Flask(__name__)
ws = WebSocket(app)
@ws.route('/echo')
def echo(ws):
while True:
msg = ws.receive()
ws.send(message)
if __name__ == '__main__':
app.run(debug=True, threads=16)
Installation
To install Flask-uWSGI-WebSocket, simply:
$ pip install Flask-uWSGI-WebSocket
Deployment
You can use uWSGI’s built-in HTTP router to get up and running quickly:
$ uwsgi --master --http :8080 --http-websockets --wsgi-file app.py
…or call app.run, passing uwsgi any arguments you like:
app.run(debug=True, host='localhost', port=8080, master=true, processes=8)
uWSGI supports several concurrency models, in particular it has nice support for Gevent. If you want to use Gevent, import flask.ext.uwsgi_websocket.GeventWebSocket and configure uWSGI to use the gevent loop engine:
$ uwsgi –master –http :8080 –http-websockets –gevent 100 –wsgi-file app.py
…or:
app.run(debug=True, gevent=100)
For production you’ll probably want to run uWSGI behind Haproxy or nginx of course, instead of using the built-int HTTP router. Explore the uWSGI documentation for more detail.
Development
It’s possible to take advantage of Flask’s interactive debugger by installing werkzeug’s DebuggedApplication middleware:
from werkzeug.debug import DebuggedApplication app.wsgi_app = DebuggedApplication(app.wsgi_app, True)
…and running uWSGI with only a single worker:
$ uwsgi --master --http :8080 --http-websockets --wsgi-file --workers 1 --threads 8 app.py
If you use app.run(debug=True), Flask-uWSGI-Websocket will do this automatically for you.
API
Flask-uWSGI-Websocket automatically performs the WebSocket handshake for you and passes your route handler a websocket client exposing uWSGI’s WebSocket API.
websocket.recv()
websocket.send(msg)
websocket.send_binary(msg)
websocket.recv_nb()
websocket.send_from_sharedarea(id, pos)
websocket.send_binary_from_sharedarea(id, pos)
In addition there is a special websocket.receive() method which tries to make non-blocking calls simpler. When using the WebSocket plugin, it blocks making it appropriate for threaded or multiprocess concurrency models. When using GeventWebSocket it’ll take advantage of gevent and make a non-blocking recv call. AsyncWebsocket should do roughly the same thing, but currently plain --async concurrency model is a bit buggy in uWSGI 2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Hashes for Flask-uWSGI-WebSocket-0.1.3.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | c3899cd1cb91d9ea8602bbd19eecf943a20f07fe401d5426a01b8a85812b78b4 |
|
MD5 | f136a68426f3f8cd335ed9fe384f9a58 |
|
BLAKE2b-256 | 2c0d79c926f045a747d03e024129e4f46117abaf9689613cf2912b29bc6422fa |