python - tutorial - tipos de datos django
Necesita ayuda para entender Comet en Python(con Django) (3)
Podría usar Socket.IO. Hay manipuladores gevent y tornado para ello. Ver mi blog en gevent-socketio con Django aquí: http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/
Después de pasar dos días enteros en esto, todavía me resulta 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.
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 al menos JS del lado del cliente).
Si entiendo correctamente, Orbited se basa en Twisted, ¿necesito algo más con él?
¿Gevent y Eventlet están en la misma categoría que Twisted? ¿Cuánto más necesito con ellos?
¿Dónde entran en esto cosas como las tiendas Celery, RabbitMQ o KV como Redis? 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.
Siento tu dolor al haber tenido que realizar la misma investigación en los últimos meses. Todavía 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 . Tenía la esperanza de establecer una comunicación directa desde el Django del lado del servidor al proceso del servidor tornadio utilizando colas (es decir, la lógica en una vista django empuja un mensaje a una cola que luego es manejada por tornadio, lo que empuja una versión codificada json de ese mensaje a todos los suscriptores interesados) pero no implementado esa parte completamente todavía. La forma en que actualmente lo tengo configurado implica:
- Un servidor tornado externo (tornadio) , que se ejecuta en otro puerto, acepta solicitudes socket.io y trabaja con modelos 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.
- Las páginas de plantilla de Django que requieren acceso en tiempo real incluyen el javascript de socket.io y establecen conexiones directas al servidor tornadio
Busqué en órbita , hookbox y gevent pero decidí irme con socket.io + tornado, ya que parecía permitirme el código javascript + python más limpio. Sin embargo, podría estar equivocado al respecto, ya que recién comencé a aprender Python / Django durante el año pasado.
Redis es relevante como una capa de persistencia que también admite la publicación / suscripción nativa. 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 ejemplo de trabajo del tipo de sistema que describes. La magia ocurre en la vista socketio :
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()
Tome la vista paso a paso:
- Configure socket.io, obtenga un cliente redis y el usuario actual
- Use Gevent para registrar un "suscriptor": esto toma los mensajes entrantes de Redis y los reenvía al navegador del cliente.
- Ejecuta un "editor" que toma mensajes de socket.io (del navegador del usuario) y los empuja hacia Redis
- Repita hasta que el socket se desconecte
El Libro de cocina de Redis ofrece un poco más de detalles sobre el lado de Redis, así como también sobre cómo puede persistir en los 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.
El apio es una "cola de tareas distribuidas", básicamente, le permite distribuir 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 hacer 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 esté totalmente confundido, se puede hacer que Celery use Gevent como su biblioteca de concurrencia subyacente).
¡Espero que ayude!