WebSocket support for Flask
Project description
flask-sock
WebSocket support for Flask (and possibly other WSGI frameworks). What makes this package different than other WebSocket servers is that it does not require a greenlet based server (gevent, eventlet) to work.
This WebSocket implementation is compatible with the following synchronous web servers:
- Werkzeug (Flask's development web server)
- Gunicorn with the
gthread
worker
In addition to the servers above, the following asynchronous web servers are supported when the Python standard library is monkey patched:
- Eventlet's WSGI server
- Gevent's WSGI server
- Gunicorn with the
eventlet
worker - Gunicorn with the
gevent
worker
Installation
pip install flask-sock
Example
from flask import Flask, render_template
from flask_sock import Sock
app = Flask(__name__)
sock = Sock(app)
@sock.route('/echo')
def echo(ws):
while True:
data = ws.receive()
ws.send(data)
Running
To run an application that uses this package, you need to use a supported web server.
Running with Werkzeug
Werkzeug supports WebSocket routing in version 2, which at this time hasn't been officially released. You can install a supported release candidate with the following command:
pip install "werkzeug>=2.0.0rc3"
To run your application use the normal method that you always use. Both the
flask run
and app.run()
methods of starting the Flask application should
work.
Running with Gunicorn
To use this package with Gunicorn you need to keep in mind that each active
WebSocket client will use up a worker. The most practical way to run a
WebSocket server is to use the --threads
option to allocate the number of
clients that you need:
gunicorn -b :5000 --threads 100 module:app
It is also okay to use multiple workers, each with a number of allocated threads:
gunicorn -b :5000 --workers 4 --threads 100 module:app
Running with eventlet
To serve your application with the eventlet WSGI server you can use the following script:
import eventlet
eventlet.monkey_patch()
from eventlet import wsgi
from module import app
wsgi.server(eventlet.listen(('', 5000)), app)
It is also possible to use Gunicorn's eventlet
worker:
gunicorn -b :5000 --worker-class eventlet module:app
Gunicorn's eventlet
worker handles a maximum of 1000 concurrent requests in a
single worker process by default. The maximum number of concurrent requests
can be changed with the --worker-connections
option. The number of workers
can be changed with the --workers
option.
Running with gevent
To serve your application with the gevent WSGI server you can use the following script:
from gevent import monkey
monkey.patch_all()
from gevent.pywsgi import WSGIServer
from module import app
WSGIServer(('127.0.0.1', 5000), app).serve_forever()
It is also possible to use Gunicorn's gevent
worker:
gunicorn -b :5000 --worker-class gevent module:app
Gunicorn's gevent
worker handles a maximum of 1000 concurrent requests in a
single worker process by default. The maximum number of concurrent requests
can be changed with the --worker-connections
option. The number of workers
can be changed with the --workers
option.
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
Built Distribution
File details
Details for the file flask-sock-0.3.0.tar.gz
.
File metadata
- Download URL: flask-sock-0.3.0.tar.gz
- Upload date:
- Size: 4.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/3.8.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | fa468d392c8de84c8d9423da4d8ae8bb7c8fc7b2d7ebd6b3e48536998743ef43 |
|
MD5 | a75b7cbc4c3e83c15f0b5da6d129222b |
|
BLAKE2b-256 | 858b2dd9929fedaebc1761a95391651cb9429653a6275c9db902fcc807c65adb |
File details
Details for the file flask_sock-0.3.0-py3-none-any.whl
.
File metadata
- Download URL: flask_sock-0.3.0-py3-none-any.whl
- Upload date:
- Size: 6.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/3.8.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9355d8b144fed1309cea6653d678aa777bbfc2e44ae7a5a767fe15281f115b35 |
|
MD5 | ec6e0bb584ca6b794149ea787405cad0 |
|
BLAKE2b-256 | 3cd008dcf953238babf96de3e0a1a624ba9bbd88761cd6449bdb42bd97cb734c |