27 votes

Django Push HTTP Response aux utilisateurs

J'ai actuellement une application web très simple écrite en Django, et je voudrais mettre en œuvre quelque chose comme un service de notification par callback/push dans mon application.

Par exemple : Lorsqu'un utilisateur (client) télécharge une photo sur le serveur, le serveur notifie cette photo à tous les autres utilisateurs connectés.

Je suppose que je peux utiliser les signaux de Django pour produire un rappel lorsqu'un utilisateur télécharge une photo, mais comment faire pour que Django envoie une notification aux autres utilisateurs ? Cette notification pourrait prendre la forme d'alertes ou simplement d'une redirection des autres utilisateurs vers une nouvelle page html qui affiche la photo téléchargée. Je préférerais cette dernière solution.

Je suis un débutant en programmation web, donc je ne suis pas sûr que cela corresponde au besoin d'une "application web en temps réel" qui implémente des choses comme les comètes ou le long-polling. Mon application est similaire à celle d'une application de chat, sauf que je ne soumets pas de fichiers texte mais des fichiers image. C'est pourquoi j'ai pensé que des solutions de type "comet" pourraient fonctionner. J'ai essayé de regarder Orbited et Twisted depuis très longtemps maintenant, mais je n'ai pas eu de chance de l'implémenter avec Django, probablement parce que je ne comprends pas comment accomplir ce que je veux avec les solutions comet. J'aimerais que les programmeurs plus expérimentés m'indiquent ce dont j'ai besoin exactement pour accomplir cela, ou si je suis dans la bonne direction ou non (avec comet).

J'apprécierais vraiment que quelqu'un me donne des conseils et des astuces sur la façon de procéder, ainsi que des liens vers des tutoriels ou des guides.

48voto

Chris W. Points 7182

HTTP est par nature un protocole "pull", c'est-à-dire qu'un client extrait des données d'un serveur, attend un certain temps et en extrait d'autres plus tard. Il n'existe en fait aucun moyen strictement HTTP de "pousser" des données d'un serveur vers un client.

Vous avez essentiellement trois options lorsque vous devez "pousser" vers un client.

(1) Faites du polling - utilisez Ajax/javascript pour interroger le serveur tous les X temps. Plus le X est petit, plus cela ressemble à une poussée, mais aussi plus votre serveur doit répondre constamment à ces demandes.

(2) Utiliser websockets . Une partie de la spécification HTML5 est appelée websockets. Les websockets permettent à un navigateur d'ouvrir une connexion persistante à un serveur. Une fois cette connexion ouverte, les données peuvent être transférées d'un client à un serveur et d'un serveur à un client, comme avec des sockets TCP plus traditionnels. Le problème avec les websockets (aux dernières nouvelles) est qu'ils peuvent être un peu capricieux d'un navigateur à l'autre et, bien sûr, ne fonctionnent pas. du tout dans les navigateurs plus anciens.

(3) Utiliser Flash avec une interface Javascript . Flash a la capacité de mettre en place connexions TCP persistantes qui peut être utilisé pour pousser/tirer des données comme avec une connexion TCP 'normale'. (Voir également cette question de l'OS : Exemples de push HTTP en Flex )


Si vous deviez commencer ce projet à partir de zéro, je vous recommanderais d'écrire votre backend en format Node.js avec Socket.io . Socket.io est un cadre de type "socket" sur lequel vous pouvez programmer, puis le client Javascript (qui s'exécute dans votre navigateur Web) détermine intelligemment la meilleure "connexion persistante" à utiliser : il essaie d'abord d'utiliser des Websockets, puis Flash, puis des interrogations longues de différents types.


Mais puisque vous avez dit que vous vouliez utiliser Python/Django, vous devriez consulter le site suivant Django-Websockets -- un cadre pour utiliser les websockets avec Django. Mais n'oubliez pas de lire le Avis de non-responsabilité que l'auteur met sur la page, il y a quelques difficultés/limitations importantes associées à son utilisation, principalement parce que Django n'a pas été conçu avec des websockets à l'esprit.

Je pense que votre meilleure chance sera d'utiliser les Websockets avec un repli intelligent vers Ajax Polling lorsque le navigateur de l'utilisateur ne le supporte pas.

5voto

fylb Points 188

Si jamais vous utilisez nginx, ce qui est un bon choix :), vous pouvez utiliser le module push http://pushmodule.slact.net/ Je l'ai trouvé plutôt facile à utiliser. Vous avez une URL pour publier des messages sur un canal (cela peut être fait facilement en python, avec httplib par exemple), et une URL pour extraire des messages d'un canal (et un canal peut être utilisé par plus d'un utilisateur). Voir aussi http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/ pour une intégration de jquery.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X