Non-Message File / Simple Long-Polling in Python (and Flask)

je cherche un moyen simple (c.-à-d. pas un qui me demande de configurer un serveur séparé pour gérer une file d'attente de messagerie) de faire un long sondage pour une petite interface web qui exécute des calculs et produit un graphique. C'est ce que mon interface web doit faire:

  1. Utilisateur demande un graphique/données dans une interface web
  2. le serveur exécute quelques calculs.
  3. pendant que le serveur exécute des calculs, un petit conteneur est mis à jour (probablement via AJAX/jQuery) avec la progression du calcul (semblable à ce que vous feriez dans un consol avec l'impression (i.e. l'impression 'fonction de densité de calcul...'))
  4. finitions de calcul et le graphique est montré à l'utilisateur.

Que le calcul est fait côté serveur, je ne suis pas vraiment sûr de savoir comment facilement. Évidemment, je voudrais configurer une API REST pour gérer le sondage, ce qui serait facile dans un flacon. Cependant, je ne sais pas comment récupérer les mises à jour réelles. Une évidence, bien que compliquée pour ce le but, la solution serait de configurer une file d'attente de messagerie et de faire un peu le long du scrutin. Cependant, je ne suis pas sûr que ce soit la bonne approche pour quelque chose d'aussi simple.

Voici mes questions:

  1. Est-il possible de faire cela en utilisant le système de fichiers? La Performance n'est pas un gros problème. AJAX / jQuery peuvent-ils trouver des messages à partir d'un fichier? Gardez le progrès pour certains .le dossier json?
  2. et le décapage? (Je ne sais pas vraiment beaucoup sur le décapage, mais peut-être que je pourrais message dict et il pourrait être lu par une API qui est la manipulation de l'interrogation).
  3. le sondage est-il la bonne approche? Est-il mieux ou plus modèle commun pour gérer cela?

j'ai l'impression de surcharger les choses, car je sais que ce genre de choses est courant sur le web. Très souvent, je vois des choses qui se passent et un peu de "chargement".GIF " image est en cours d'exécution alors que certains calculs sont en cours (par exemple, dans Google Analytics).

Merci pour votre à l'aide!

24
demandé sur aaronlevin 2012-06-22 18:25:11

2 réponses

j'ai créé plusieurs applications comme celle-ci en utilisant juste Flask et jQuery. Basé sur cette expérience, je dirais que votre plan est bon.

  1. N'utilisez pas le système de fichiers. vous rencontrerez des problèmes de sécurité/protections JavaScript. Dans le cas peu probable où vous trouvez des solutions de rechange raisonnables, vous n'auriez toujours rien portable ou évolutif. Utilisez plutôt un petit cadre local de service web, comme un flacon.

  2. ne pas faire de cornichons. L'utilisation de JSON. C'est le langage des applications web et des interfaces REST. jQuery et ces jolis plugins basés sur jQuery pour dessiner des diagrammes, des graphiques et autres attendront JSON. C'est facile à utiliser, lisible par l'homme, et pour les applications à petite échelle, il n'y a aucune raison d'aller ailleurs.

  3. le Long du scrutin est très bien pour ce que vous voulez accomplir. les applications purement HTTP ont certaines limites. Et WebSockets et similaires socket-ish couches comme Socket.IO " sont le futur."Mais de trouver d'après mon expérience, de bons exemples simples de l'implémentation côté serveur ont été difficiles. J'ai bien cherché. Il y a beaucoup d'exemples que voulez vous configurer le Nœud.js, REDIS, et d'autres morceaux de middleware. Mais pourquoi devrions-nous avoir à mettre en place deux ou trois serveurs middleware? C'est grotesque. Donc, le long du scrutin sur un simple, pur Python framework web comme Fiole est la manière d'aller de l'OMI.

le code est un peu plus qu'un fragment, donc plutôt que de l'inclure ici, j'ai mis un exemple simplifié dans un dépôt Mercurial sur bitbucket que vous pouvez librement réviser, copier, ou cloner. Il y a trois parties:

  • serve.py un serveur basé sur Python/Flask
  • templates/index.html 98% HTML, 2% fichier de modèle de la Fiole à base de serveur de rendu HTML
  • static/lpoll.js jQuery client basé sur
40
répondu Jonathan Eunice 2012-06-22 18:13:30

Long-polling était une solution raisonnable avant que le support simple et naturel des Sockets Web ne vienne à la plupart des navigateurs, et avant qu'il ne soit facilement intégré aux applications Flask. Mais ici, à la mi-2013, le support des sockets Web a fait du chemin.

Voici un exemple, semblable à celui ci-dessus, mais intégrant le flacon et les douilles Web. Elle court sur les composants serveur gevent et gevent-websocket.

notez que cet exemple n'est pas conçu pour être un chef-d'œuvre de douilles Web. Il conserve une grande partie de la lpoll structure, pour les rendre plus facilement comparables. Mais il améliore immédiatement la réactivité, le serveur overhead, et l'interactivité de l'application Web.

10
répondu Jonathan Eunice 2013-08-07 01:36:27