Flask-SocketIO: créer une application Flask avec des websockets =============================================================== ![category](développement) ![tag](python) ![tag](flask) Une utilisation web utilise souvent des API REST pour récupéer des informations. cela signifie que l'application va demander à un serveur des informations. Par contre le serveur web ne pousse pas à l'application des informations. Pour cela il faut utiliser les *websockets*. Les applications type qui utilisent cette technologie sont - chatte - application de suivi temps réel - ... Flask peut intégrer cette technologie de socketio par le module *Flask-SocketIO* qu'on trouve sur https://github.com/miguelgrinberg/Flask-SocketIO Installation ------------ ```bash pip install Flask-SocketIO ``` j'ai eu des soucis de compatibilité client, j'ai donc spécifié les versions ```bash pip install --upgrade python-socketio==4.6.0 pip install --upgrade python-engineio==3.13.2 pip install --upgrade Flask-SocketIO==4.3.1 ``` Utilisation ----------- Il existe un excellent exemple sur https://github.com/miguelgrinberg/Flask-SocketIO ```bash git clone https://github.com/miguelgrinberg/Flask-SocketIO.git cd Flask-SocketIO python example/app.py ``` un exemple personnel qui demontre le fonctionnement: - envoi d'un message de l'application vers le back-office Flask - envoi d'un message du back-office Flask vers n applications le fichier app.py ```python #!/usr/bin/env python from flask import Flask, render_template, current_app from flask_socketio import SocketIO, emit import datetime import time app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO(app, async_mode=None) @app.route('/') def index(): return render_template('index.html', async_mode=socketio.async_mode) @app.route('/test') def test(): now = datetime.datetime.now() emit('my_response', {'data': 'coucou', 'time': now.strftime("%d/%m/%Y %H:%M:%S")}, namespace='/test', broadcast=True) return 'send msg coucou at %s' % now.strftime("%d/%m/%Y %H:%M:%S") @socketio.on('my_event', namespace='/test') def test_reception_msg(message): current_app.logger.error("reception message %s" % message) if __name__ == '__main__': socketio.run(app, debug=True) ``` le fichier templates/index.html ```html Flask-SocketIO Test

Flask-SocketIO Test

``` Vous ouvrez deux navigateurs - http://127.0.0.1:5000/ vous visualiez les messages envoyés par le back-office - http://127.0.0.1:5000/test vous émettez des messages par le back office