J'ai un projet web utilisant php et un script python qui modifie les dossiers. Je veux exécuter du javascript sur le site Web basé sur par exemple. une création de dossier effectuée dans le script python.Python SocketIO émettant un événement après la création du serveur
Mon idée était de travailler avec python socketio. J'ai la notification de connexion de base fonctionnant et émet des js sur un site Web sont manipulés par le js aussi bien.
Le problème est que je ne peux pas émettre d'événements après le démarrage du serveur d'événement. J'ai essayé de configurer le mode asynchrone mais il n'a pas le résultat souhaité.
Voici mon code à ce jour:
import socketio
from flask import Flask, render_template
import eventlet
import sys
sio = socketio.Server(async_mode='eventlet')
app = Flask(__name__)
@sio.on('connect')
def connect(sid, environ):
print('connect ', sid)
sio.emit('channel', 'new connection')
sys.stdout.flush()
@sio.on('mes')
def message(sid, data):
print('message ', data)
sys.stdout.flush()
app = socketio.Middleware(sio)
eventlet.wsgi.server(eventlet.listen(('', 8000)), app)
# create folder HERE and emit event which will be sent to browser
MISE À JOUR:
j'ai commencé à l'aide de fils comme dans le code suivant: (Y at-il un problème avec l'aide de fils comme ça ou une autre meilleure approche?)
import socketio
from flask import Flask, render_template
import eventlet
import sys
import thread
import time
sio = socketio.Server(async_mode='gevent')
@sio.on('connect')
def connect(sid, environ):
print('connect ', sid)
sio.emit('channel', 'new connection')
sys.stdout.flush()
@sio.on('mes')
def message(sid, data):
print('message ', data)
sio.emit('channel', 'yeah')
sys.stdout.flush()
from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
app = socketio.Middleware(sio)
def worker(threadName):
count = 1
while count > 0:
time.sleep(1)
# trying to emit message HERE
sio.emit('mes', 'foo ' + str(count))
print "working " + str(count)
sys.stdout.flush()
count += 1
def server(threadName):
print "server starting"
sys.stdout.flush()
pywsgi.WSGIServer(('', 8000), app, handler_class=WebSocketHandler).serve_forever()
try:
thread.start_new_thread(worker, ("Thread-1",))
thread.start_new_thread(server, ("Thread-2",))
except:
print "Error: unable to start thread"
while 1:
pass
Le problème est maintenant le sio.emit('mes', 'foo ' + str(count))
émet le message - mais le navigateur ne l'attrape que toutes les 20 ~ 30 secondes, puis tous les événements manquants sont traités. Voir l'image avec les cadres de la console de développement.
Je ne suis pas certain de comprendre. Essayez-vous d'exécuter du code en bas, juste après le démarrage du serveur? C'est maintenant comment les choses fonctionnent, l'appel de création de serveur ne retourne pas. – Miguel
@Miguel Oui c'est ce que j'essayais de faire. J'ai mis à jour ma question avec mon nouveau code en utilisant des threads - est-ce correct d'utiliser des threads comme ça? Et savez-vous pourquoi les nouveaux événements ne sont pas repris immédiatement? – rambii
Vous n'avez pas vraiment besoin de mettre le serveur dans un thread d'arrière-plan. Il suffit de démarrer le thread de travail avant de démarrer le serveur sur le thread principal. A part ça, tout ce que je peux penser c'est que vous devriez utiliser 'gevent.sleep()' au lieu de 'time.sleep()'. – Miguel