2011-04-10 21 views
30

Después de pasar dos días enteros en esto, sigo encontrando que es imposible comprender todas las opciones y configuraciones para Comet en Python. He leído todas las respuestas aquí, así como todas las publicaciones de blog que pude encontrar. Siento que estoy a punto de sufrir una hemorragia en este momento, por lo que mis mejores disculpas por cualquier problema con esta pregunta.Necesito ayuda para entender Comet en Python (con Django)

Soy completamente nuevo en todo esto, todo lo que he hecho antes eran simples sitios no en tiempo real con un backend de PHP/Django en Apache.

Mi objetivo es crear una aplicación de chat en tiempo real; con suerte vinculado a Django para usuarios, autenticación, plantillas, etc.

Cada vez que leo sobre una herramienta, dice que necesito otra herramienta encima, se siente como una cadena interminable.

Antes que nada, ¿alguien puede categorizar todas las herramientas necesarias para este trabajo?
He leído sobre diferentes servidores, bibliotecas de redes, motores, JavaScripts para el lado del cliente, y no sé qué más. Nunca imaginé que sería tan complejo.

Twisted/Twisted Web parece ser popular, pero no tengo idea de integrarlo o qué más necesito (supongo que necesito JS del lado del cliente al menos).

Si entiendo correctamente, Orbited está construido en Trenzado, ¿necesito algo más con él?

¿Están Gevent y Eventlet en la misma categoría que Twisted? ¿Cuánto más necesito con ellos?

¿Por qué cosas como las tiendas de Apio, RabbitMQ o KV como Redis entran en esto? Realmente no entiendo el concepto de una cola de mensajes. ¿Son esenciales y qué servicio ofrecen?

¿Hay algún tutorial completo de la aplicación de chat que deba ver?

Estaré en deuda con cualquier persona que me ayude a superar esta barrera mental, y si omití algo, no dude en preguntar. Sé que es una pregunta bastante cargada.

+0

¿Has echado un vistazo a esto? Parece tener toda la fuente requerida para el trabajo. http://www.rkblog.rk.edu.pl/w/p/django-and-comet/ – jbcurtin

+0

@jbcurtin Muchas gracias, ese es probablemente el mejor artículo que he leído. Orbited no parece estar muy bien mantenido, ¿hay muchos proyectos similares? Sigo teniendo problemas para saber si necesito usar algo más con eso (especialmente porque quiero que todos los mensajes sean persistentes en una base de datos); ¿Cómo todavía necesito saber todo sobre Twisted? – XOR

+0

No creo que vayas a tener mucha suerte si empleas django para completar esta tarea. Lo más importante que pude encontrar fue 'django evserver'.Twisted podría ser el camino a seguir, al final el cometa simplemente está suspendiendo un hilo para mantenerlo abierto. Tendría que matar todo el ciclo de vida de django para lograr esto. – jbcurtin

Respuesta

5

Siento tu dolor, habiendo tenido que pasar por la misma investigación en los últimos meses. No he tenido tiempo para tratar con la documentación adecuada, pero tengo un ejemplo práctico del uso de Django con socket.io y tornadio en http://bitbucket.org/virtualcommons/vcweb - Esperaba establecer una comunicación directa desde el servidor Django al proceso del servidor tornadio utilizando colas (es decir, la lógica en una vista django empuja un mensaje a una cola que luego maneja el tornadio que envía una versión codificada json de ese mensaje a todos los suscriptores interesados) pero aún no ha implementado esa parte completamente. La forma en que he recibido actualmente se estableció implica:

  1. Un external tornado (tornadio) server, que se ejecuta en otro puerto, aceptando solicitudes Socket.IO y trabajar con modelos de Django. Lo único que escribe este proceso de servidor hace a la base de datos son los mensajes de chat que deben almacenarse. Tiene acceso completo a todos los modelos de Django, etc., y todas las interacciones en tiempo real deben pasar directamente a través de este proceso del servidor.
  2. páginas de plantillas de Django que requieren acceso en tiempo real incluyen la socket.io javascript y establecer conexiones directas al servidor tornadio

Miré en orbited, hookbox y gevent pero decidí ir con socket.io + tornado ya que parecía permitirme el código más limpio de javascript + python. Sin embargo, podría estar equivocado al respecto, ya que recién comencé a aprender Python/Django durante el año pasado.

+0

Excelente respuesta, gracias. Verificará Tornadio y su código. ¡También soy nuevo en Python/Django, así que estoy abierto a todas las sugerencias! – XOR

3

Redis es relevante como una capa de persistencia que también admite publish/subscribe nativo. Por lo tanto, en lugar de una situación en la que está sondeando el archivo db en busca de nuevos mensajes, puede suscribirse a un canal y enviarle mensajes.

Encontré un working example del tipo de sistema que describes. La magia sucede en el socketio view:

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() 

de la opinión de paso-a-paso:

  1. Establecer socket.io, conseguir un cliente Redis y el usuario actual
  2. Uso GEvent registrar un "suscriptor": recibe los mensajes entrantes de Redis y los envía al navegador del cliente.
  3. ejecutar un "editor", que lleva mensajes de socket.io (desde el navegador del usuario) y los empuja hacia Redis
  4. Repetir hasta que se desconecta la toma

El libro de cocina Redis da una little more detail en el lado Redis , además de discutir cómo puede persistir mensajes.

Respecto al resto de su pregunta: Twisted es una biblioteca de redes basada en eventos, podría considerarse una alternativa a Gevent en esta aplicación. Es poderoso y difícil de depurar en mi experiencia.

Apio es una "cola de tareas distribuidas", básicamente, le permite repartir unidades de trabajo en varias máquinas. El ángulo "distribuido" significa que se requiere algún tipo de transporte entre las máquinas. Apio admite varios tipos de transporte, incluidos RabbitMQ (y Redis también).

En el contexto de su ejemplo, Aplery solo sería apropiado si tuviera que realizar algún tipo de procesamiento costoso en cada mensaje, como escanear por blasfemia o algo así. Aún así, algo tendría que iniciar la tarea de Apio, por lo que tendría que haber algún código para la devolución de llamada de socket.io.

(En caso de que no estuviera totalmente confundido, apio sí se pueden hacer para utilizar GEvent como su biblioteca de concurrencia subyacente.)

Espero que ayude!

Cuestiones relacionadas