Django Push HTTP Respuesta a los usuarios [cerrado]


Actualmente tengo una aplicación web muy simple escrita en Django, y me gustaría implementar algo como un servicio de devolución de llamada/notificación push en mi aplicación.

Por ejemplo: Cuando un usuario (cliente) carga una foto en el servidor, el servidor notifica a todos los demás usuarios conectados sobre esa foto.

Supongo que puedo usar las señales de Django para producir una devolución de llamada cuando un usuario sube una foto, pero ¿cómo consigo que Django publique una notificación a los otros usuarios? Esta notificación podrían ser alertas o simplemente redirigir a los otros usuarios a un nuevo html que muestre la imagen cargada. Preferiría lo último.

Soy un principiante en programación web, por lo que no estoy seguro de si esto se ajusta a la factura como la necesidad de una 'aplicación web en tiempo real' que implementa cosas como comet o long-polling. Mi aplicación es similar a la de una aplicación de chat, excepto que no estoy enviando archivos de texto, sino archivos de imagen. Por eso pensé que Comet Solutions funcionaría. Tengo intenté mirar Orbited y Twisted durante mucho tiempo pero no tuve suerte en implementarlo con Django, probablemente porque no entiendo cómo lograr lo que quiero con comet solutions. Me gustaría que los programadores más experimentados me señalaran qué es exactamente lo que necesito para lograr esto, o si me estoy dirigiendo en la dirección correcta o no (con comet).

Realmente apreciaría si alguien pudiera darme algunos consejos y sugerencias sobre cómo proceder, como así como enlaces tutoriales o guías.

Author: evkwan, 2011-03-30

2 answers

HTTP es inherentemente un protocolo "pull" i es decir, un cliente extrae datos de un servidor, espera un rato y luego extrae más datos más tarde. En realidad, no hay una forma estrictamente HTTP de "enviar" datos a un cliente desde un servidor.

Básicamente tienes tres opciones cuando necesitas "empujar" a un cliente.

(1) Do polling use use Ajax/javascript para sondear el servidor cada X cantidad de tiempo. Cuanto más pequeña sea la X, más "se siente" como un push, pero también más sobrecarga sus experiencias de servidor tener que responder constantemente a estas solicitudes.

(2) Use websockets. Parte de la especificación HTML5 es algo llamado websockets. Websockets permite que un navegador abra una conexión persistente a un servidor. Una vez que se ha abierto esta conexión, los datos se pueden empujar de un lado a otro del cliente al servidor y del servidor al cliente, al igual que con los sockets TCP más tradicionales. El problema con websockets (lo último que escuché) era que todavía pueden ser un poco temperamentales entre navegadores, y de el curso no funcionará en absoluto en navegadores antiguos.

(3) Use Flash con una interfaz Javascript. Flash tiene la capacidad de configurar conexiones TCP persistentes, que se pueden usar para empujar/extraer datos al igual que con una conexión TCP 'normal'. (Vea esta pregunta también: Ejemplos HTTP push en Flex )


Si empezaras este proyecto desde cero te recomendaría que escribieras tu backend en el nodo .js con Socket.io . Socket.io es un framework " tipo socket "en el que puedes programar y luego el cliente Javascript (que se ejecuta en tu webbrowser) determina inteligentemente la mejor" conexión persistente " a usar first primero intenta usar Websockets, luego Flash, luego un largo sondeo de varios tipos.


Pero ya que has dicho que quieres usar Python/Django entonces deberías revisar Django-Websockets a un framework para usar websockets con Django. Pero asegúrese de leer el Descargo de Responsabilidad el autor pone en la página, hay algunas dificultades/limitaciones significativas asociadas con su uso, principalmente porque Django no fue diseñado con websockets en mente.

Creo que su mejor apuesta terminará siendo el uso de Websockets con un respaldo inteligente a Ajax Polling cuando el navegador del usuario no lo soporta.

 56
Author: Chris W.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:01:59

Si alguna vez usa nginx, que es una buena opción :), puede usar el módulo push http://pushmodule.slact.net / , me pareció bastante fácil de usar. Tiene una URL para publicar mensajes en un canal (que se puede hacer fácilmente en python, con httplib por ejemplo), y una URL para extraer mensajes de un canal (y un canal puede ser utilizado por más de un usuario). Véase también http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery / para una integración con jquery.

 7
Author: fylb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-30 07:20:26