6
votes

Flask Server envoyé une exception de socket d'événements

Je pense à utiliser SSE pour appuyer sur de nouvelles données sur le client et utiliser FLOT (bibliothèque de graphique JavaScript) Afficher les mises à jour "Live". Mon serveur s'exécute sur le cadre de la fiole Python et j'ai compris comment appuyer sur les données sur le client, mais le problème se produit dès que je quitte la page: XXX PRE>

Je comprends pourquoi l'erreur se produit - La prise n'est jamais fermée en raison de la boucle infinie servant des données "en direct". La question est de savoir comment détecter le changement de page et bien fermer la prise? Puis-je fermer la connexion du côté du client? Comment puis-je détecter le changement de page alors? P>

Il s'agit du squelette de code de serveur, je voudrais bien sûr remplacer le message texte avec JSON contenant la liste des objets à afficher: P>

def event_stream():
    import time
    while True:
        time.sleep(1)
        yield "data: This is a message number X.\n\n"

@app.route('/stream')
def stream():
    return Response(event_stream(), mimetype="text/event-stream")


0 commentaires

4 Réponses :


2
votes

Vous pouvez utiliser onbeforeunload ou jQuery's window.unload () pour faire un appel AJAX à une méthode de déchirure qui ferme la poignée. Quelque chose comme: xxx

Il existe des incohérences avec la manière dont le décharge () / onbeforeunload () est manipulé, donc vous pouvez avoir des Plus de travail à faire dans quelque chose comme Chrome.


3 commentaires

C'était la solution que j'étais venue pour finir par vous remercier de votre réponse.


C'est une mauvaise solution à mon avis. Cela pourrait provoquer des fuites de mémoire si le navigateur ne l'exécute pas (se bloque de manière inattendue, la connexion diminue, etc.).


C'est pourquoi j'ai noté "Vous pouvez avoir encore plus de travail à faire dans quelque chose comme Chrome" (qui peut ou non permettre au développeur de tirer ces types d'événements ...)



2
votes

Je n'ai pas de meilleure réponse, mais je ne pense pas que la demande ci-dessus Ajax au serveur est bonne.

Dans le flacon, SSE Utilisez le streaming dans un objet de réponse, s'il existe un moyen de détecter la déconnexion ou le tuyau cassé en réponse, il serait préférable de gérer les événements de la prise et de libérer d'autres ressources allouées.


1 commentaires

Pendant que vous avez raison, ce qui vous permet de tirer une méthode AJAX n'est pas idéal, ce qui utilise quelque chose à utiliser en streaming, puis détecter un tuyau cassé semble être un très grand nombre de frais généraux simplement pour tirer quelque chose sur la page Fermer, surtout si vous n'avez pas besoin de la réponse ( qui fera échouer ma méthode de toute façon - car au moins chrome ne permet pas la présentation de la réponse)



2
votes

J'ai trouvé un sale (inclut Mokey Patching), mais une solution de travail.

Parce qu'il y a un Exception dans socketserver.streamrequesthandler.finish code> Lorsque la connexion tombe, nous pouvons le corriger pour attirer l'exception et la gérer comme nous le souhaitons: P>

@app.route(url)
def method(host):
    return Response(stream_with_context(event_stream()),
                    mimetype='text/event-stream')


0 commentaires

0
votes

N'utilisez pas de flacon Inner Dev WSGI Server dans le produit env. Envisagez d'utiliser UWSGI qui pourrait gérer cette erreur de prise avec élégance.

Pendant ce temps, pensez à utiliser Python3 qui attrape également ce sockrt bien cassé.


0 commentaires