28 votes

Besoin d'aide pour comprendre Comet en Python (avec Django)

Après avoir passé deux journées entières sur ce que je suis toujours de trouver qu'il est impossible de comprendre toutes les options et configurations de la Comète en Python. J'ai lu toutes les réponses ici aussi bien que chaque billet de blog que j'ai pu trouver. Il se sent comme je suis sur le point d'hémorragie à ce stade, ce qui est en mon pouvoir d'excuses pour quelque chose de mal avec cette question.

Je suis entièrement nouveau à tout cela, tout ce que j'ai fait avant ont été simple non-temps réel des sites avec un PHP/Django backend sur Apache.

Mon but est de créer un chat en temps réel de l'application; j'espère que liée à Django pour les utilisateurs, l'authentification, les modèles, etc.

Chaque fois que j'ai lu sur un outil, il dit que j'ai besoin d'un autre outil sur le dessus de cela, il se sent comme une chaîne interminable.

Tout d'abord, quelqu'un peut-il catégoriser tous les outils nécessaires pour ce poste?
J'ai lu sur différents serveurs, la mise en réseau des bibliothèques, des moteurs, des JavaScripts pour le côté client, et je ne sais pas quoi d'autre. Je n'aurais jamais imaginé que ce serait aussi complexe.

Torsadée / Twisted Web semble être populaire, mais je n'ai aucune idée de l'intégrer ou quoi d'autre j'ai besoin (deviner j'ai besoin de client-côté JS au moins).

Si je comprends bien, mis sur orbite est construit sur Torsadée, ai-je besoin d'autre chose avec elle?

Sont Gevent et Eventlet dans la même catégorie que Tordu? Combien dois-je avec eux?

Où faire des choses comme le Céleri, RabbitMQ, ou KV magasins comme le Redis dans tout cela? Je ne comprends vraiment pas le concept d'un message de la file d'attente. Sont-ils essentiels et des services que fournissent-ils?

Il n'existe aucun complète application de chat tutoriels je devrais regarder?

Je vais être entièrement redevable à quelqu'un qui m'aide à passé cet obstacle, et si j'ai oublié quelque chose n'hésitez pas à demander. Je sais que c'est un assez chargé de la question.

8voto

codysoyland Points 288

Vous pouvez utiliser Socket.IO. Il y a des gestionnaires de gevent et de tornade pour cela. Voir mon article de blog sur gevent-socketio avec Django ici: http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/

5voto

A Lee Points 3052

Je ressens votre douleur, d'avoir eu à passer par les mêmes de la recherche au cours des derniers mois. Je n'ai pas eu le temps de traiter avec la documentation appropriée encore, mais j'ai un exemple de l'utilisation de Django avec le socket.io et tornadio à http://bitbucket.org/virtualcommons/vcweb - j'espérais directement la communication de la Django côté serveur pour la tornadio processus de serveur à l'aide de files d'attente (c'est à dire, la logique dans un django vue pousse un message dans une file d'attente qui ensuite est prise en charge par tornadio qui pousse un json à la version encodée de ce message à tous les abonnés), mais qui n'ont pas mis en œuvre cette partie encore. Le moyen que j'ai actuellement obtenu il a mis en place consiste à:

  1. Un externe tornade (tornadio) serveur, en cours d'exécution sur un autre port, l'acceptation de la prise.demandes d'e / s et de travailler avec Django modèles. Le seul écrit ce processus de serveur de fait à la base de données sont les messages de chat qui doivent être stockés. Il dispose d'un accès complet à tous les modèles Django, etc., et tous les échanges en temps réel besoin pour aller directement à travers ce processus de serveur.
  2. Django template des pages qui nécessitent un accès en temps réel comprennent le support.io javascript et établir des connexions directes à la tornadio serveur

J'ai regardé dans les autour de, hookbox, et gevent , mais a décidé d'aller avec la prise.io + tornade comme il semblait me permettre le plus propre javascript + code python. J'ai peut-être tort sur que si, ayant tout juste commencé à apprendre le langage Python/Django au cours de la dernière année.

3voto

bcattle Points 475

Redis est pertinent en tant que couche de persistance qui prend également en charge native de la publication/abonnement. Donc au lieu d'une situation où vous êtes d'interrogation de la bd à la recherche de nouveaux messages, vous pouvez vous abonner à un canal, et les messages poussé à vous.

J'ai trouvé un exemple du type de système que vous décrivez. La magie qui se passe dans le socketio vue:

def socketio(request):
    """The socket.io view."""
    io = request.environ['socketio']
    redis_sub = redis_client().pubsub()
    user = username(request.user)

    # Subscribe to incoming pubsub messages from redis.
    def subscriber(io):
        redis_sub.subscribe(room_channel())
        redis_client().publish(room_channel(), user + ' connected.')
        while io.connected():
            for message in redis_sub.listen():
                if message['type'] == 'message':
                    io.send(message['data'])
    greenlet = Greenlet.spawn(subscriber, io)

    # Listen to incoming messages from client.
    while io.connected():
        message = io.recv()
        if message:
            redis_client().publish(room_channel(), user + ': ' + message[0])

    # Disconnected. Publish disconnect message and kill subscriber greenlet.
    redis_client().publish(room_channel(), user + ' disconnected')
    greenlet.throw(Greenlet.GreenletExit)

    return HttpResponse()

Prendre le point de vue de l'étape-par-étape:

  1. Configurer socket.io, obtenir un redis client et de l'utilisateur actuel
  2. Utilisation Gevent pour inscrire un "abonné" - ce qui prend les messages entrants à partir de Redis et les transmet au navigateur client.
  3. Exécuter un "éditeur" qui prend les messages à partir de socket.io (à partir du navigateur de l'utilisateur) et les pousse vers le Redis
  4. Répétez jusqu'à ce que la douille se déconnecte

Le Redis livre de recettes donne un peu plus de détail sur le Redis côté, ainsi que discuter de la façon dont vous pouvez conserver les messages.

Concernant le reste de votre question: Twisted est un événement de réseautage sur la bibliothèque, il pourrait être considéré comme une alternative à Gevent dans cette application. C'est puissant et difficile à déboguer dans mon expérience.

Le céleri est un "distributed file d'attente des tâches" - en gros, il vous permet de propagation des unités de travail sur plusieurs machines. Le "distribué" angle signifie une certaine forme de transport est nécessaire entre les machines. Le céleri prend en charge plusieurs types de transport, y compris RabbitMQ (et Redis trop).

Dans le cadre de votre exemple, le Céleri ne serait appropriée si vous aviez à faire une sorte de traitement coûteux sur chaque message que l'analyse de blasphèmes ou de quelque chose. Même encore, quelque chose aurait pour lancer le Céleri tâche, donc il n'y aurait besoin d'être un code à l'écoute pour la prise.io de rappel.

(Juste au cas où vous n'étiez pas totalement confus, Céleri lui-même peut être fait pour utiliser Gevent comme son sous-jacente de la simultanéité de la bibliothèque.)

Espérons que ça aide!

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