Respuesta HTTP de Django Push a los usuarios

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

Por ejemplo: cuando un usuario (cliente) carga una foto al 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 callback cuando un usuario sube una foto, pero ¿cómo hago para que Django publique una notificación a los otros usuarios? Esta notificación podría ser alertas o simplemente redireccionar a los otros usuarios a un nuevo html que muestre la imagen cargada. Yo preferiría este último.

Soy un principiante en la progtwigción web, por lo que no estoy seguro si esto encaja en la necesidad de una ‘aplicación web en tiempo real’ que implemente cosas como cometas o encuestas largas. Mi aplicación es similar a la de una aplicación de chat, excepto que no estoy enviando archivos de texto sino archivos de imágenes. Por eso, pensé que las soluciones de cometa funcionarían. He intentado mirar Orbited and Twisted durante mucho tiempo pero no tuve suerte en implementarlo con Django, probablemente porque no entiendo cómo lograr lo que quiero con las soluciones de cometa. Me gustaría que los progtwigdores más experimentados me señalaran qué es exactamente lo que necesito para lograr esto, o si estoy yendo en la dirección correcta o no (con el cometa).

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

HTTP es intrínsecamente un protocolo de “extracción”, es decir, un cliente extrae datos de un servidor, espera durante un tiempo y luego extrae más datos más adelante. En realidad, no existe una forma estrictamente HTTP de “enviar” datos a un cliente desde un servidor.

Básicamente tiene tres opciones cuando necesita “presionar” a un cliente.

(1) Hacer encuestas: 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 empujón, pero también la mayor sobrecarga que experimenta su servidor tiene 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 enviar y recibir de cliente a servidor y de servidor a cliente, al igual que con los zócalos TCP más tradicionales. El problema con websockets (lo último que escuché) es que todavía pueden ser un poco temperamentales entre los navegadores, y por supuesto no funcionarán en navegadores más antiguos.

(3) Use Flash con una interfaz de Javascript . Flash tiene la capacidad de configurar conexiones TCP persistentes , que se pueden usar para enviar / extraer datos al igual que con una conexión TCP “normal”. (Consulte también esta pregunta SO: ejemplos de inserción HTTP en Flex )


Si estuviera comenzando este proyecto desde cero, le recomendaría que escriba su backend en Node.js con Socket.io . Socket.io es un marco “similar a un zócalo” en el que puede progtwigr y luego el cliente de Javascript (que se ejecuta en su navegador web) determina de forma inteligente la mejor “conexión persistente” a usar: primero intenta usar Websockets, luego Flash, luego larga encuesta de varios tipos.


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

Creo que su mejor opción será usar Websockets con una alternativa inteligente a Ajax Polling cuando el navegador del usuario no lo admita.

Si alguna vez usa nginx, que es una buena opción :), puede usar el módulo de inserción http://pushmodule.slact.net/ , lo encontré 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). Ver también http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/ para una integración de jquery.