python flask long-polling

Cola de mensajes no largos/encuesta larga simple en Python(y Flask)



long-polling (2)

He creado varias aplicaciones como esta usando solo Flask y jQuery. Basado en esa experiencia, diría que su plan es bueno.

  1. No use el sistema de archivos. Se encontrará con problemas / protecciones de seguridad de JavaScript. En el caso improbable de que encuentre soluciones razonables, aún no tendría nada portátil ni escalable. En su lugar, use un pequeño marco de servicio web local, como Flask.

  2. No encurtir Use JSON. Es el lenguaje de las aplicaciones web y las interfaces REST. jQuery y esos complementos agradables basados ​​en jQuery para dibujar gráficos, gráficos y demás, esperan JSON. Es fácil de usar, legible para los humanos, y para aplicaciones a pequeña escala, no hay razón para ir a ningún otro lado.

  3. Long-polling está bien para lo que quieres lograr. Las aplicaciones puras basadas en HTTP tienen algunas limitaciones. Y WebSockets y capas socket-ish similares como Socket.IO "son el futuro". Pero encontrar ejemplos buenos y simples de la implementación del lado del servidor, en mi experiencia, ha sido difícil. Me he visto duro. Hay muchos ejemplos que desean que configure Node.js, REDIS y otras piezas de middleware. ¿Pero por qué deberíamos tener que configurar dos o tres servidores de middleware por separado? Es ridículo. Por mucho tiempo, la votación en un marco web simple y puro de Python como Flask es el camino a seguir para IMO.

El código es un poco más que un fragmento, así que en lugar de incluirlo aquí, he puesto un ejemplo simplificado en un repositorio de Mercurial en bitbucket que puedes revisar, copiar o clonar libremente. Hay tres partes:

  • serve.py un servidor basado en Python / Flask
  • templates/index.html 98% HTML, 2% de archivo de plantilla, el servidor basado en Flask lo renderizará como HTML
  • static/lpoll.js un cliente basado en jQuery

Estoy buscando un método simple (es decir, no uno que me obligue a configurar un servidor por separado para manejar una cola de mensajes) para hacer una encuesta larga para una pequeña interfaz web que ejecuta cálculos y produce un gráfico. Esto es lo que mi interfaz web debe hacer:

  1. El usuario solicita un gráfico / datos en una interfaz web
  2. El servidor ejecuta algunos cálculos.
  3. Mientras el servidor ejecuta cálculos, se actualiza un pequeño contenedor (probablemente a través de AJAX / jQuery) con el progreso del cálculo (similar a lo que haría en una consola con impresión (es decir, imprimir ''calculando la función de densidad ...''))
  4. Los finales de cálculo y el gráfico se muestran al usuario.

Como el cálculo está hecho en el lado del servidor, no estoy seguro de cómo configurarlo fácilmente. Obviamente, voy a querer configurar una API REST para manejar la votación, lo que sería fácil en Flask. Sin embargo, no estoy seguro de cómo recuperar las actualizaciones reales. Una solución obvia, aunque complicada para este propósito, sería configurar una cola de mensajes y realizar encuestas largas. Sin embargo, no estoy seguro de que este sea el enfoque correcto para algo tan simple.

Aquí están mis preguntas:

  1. ¿Hay alguna manera de hacer esto usando el sistema de archivos? El rendimiento no es un gran problema. ¿Puede AJAX / jQuery encontrar mensajes de un archivo? Guarde el progreso en algún archivo .json?
  2. ¿Qué pasa con el decapado? (Realmente no sé mucho sobre el decapado, pero tal vez podría extraer un mensaje de dict y podría ser leído por una API que está manejando el sondeo).
  3. ¿El sondeo es incluso el enfoque correcto? ¿Hay un patrón mejor o más común para manejar esto?

Tengo la sensación de que estoy complicando las cosas ya que sé que este tipo de cosas es común en la web. Muy a menudo veo cosas que suceden y una pequeña imagen de "loading.gif" se está ejecutando mientras se realizan algunos cálculos (por ejemplo, en Google Analytics).

¡Gracias por tu ayuda!


Long-polling fue una solución razonable antes de que la mayoría de los navegadores ofrecieran soporte simple y natural para Web Sockets, y antes se integraba fácilmente junto con las aplicaciones de Flask. Pero aquí a mediados de 2013, el soporte de Web Socket ha recorrido un largo camino.

Aquí hay un ejemplo , similar al anterior, pero que integra Flask y Web Sockets. Se ejecuta encima de los componentes del servidor de gevent y gevent-websocket .

Tenga en cuenta que este ejemplo no pretende ser una obra maestra de Web Socket. Conserva gran parte de la estructura lpoll , para que sea más fácil de comparar. Pero de inmediato mejora la capacidad de respuesta, la sobrecarga del servidor y la interactividad de la aplicación web.