2012-06-22 16 views
24

Estoy buscando un método simple (es decir, no uno que me obligue a configurar un servidor separado para manejar una cola de mensajes) para realizar una encuesta larga una pequeña interfaz web que ejecuta cálculos y produce un gráfico. Esto es lo que mi interfaz web tiene que hacer:cola no de mensaje/larga duración simple en Python (y frasco)

  1. El usuario solicita un gráfico/datos en una interfaz web
  2. Server se 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 'calcular la función de densidad ...'))
  4. El usuario muestra los gráficos y los finales de cálculo.

Como todo el cálculo se realiza en el 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 una manera de hacer esto utilizando 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 sobrecomplicando 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 su ayuda!

Respuesta

39

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

  1. No utilice el sistema de archivos. Encontrará 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 pique en vinagre. Usar 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 quiere 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, por lo que en lugar de incluir aquí, he puesto un ejemplo simplificado en a Mercurial repository on bitbucket que pueda revisar libremente, copiar o clon. Hay tres partes:

  • serve.py un servidor basado en Python/Frasco
  • templates/index.html 98% HTML, plantilla 2% presentar el servidor basado en frasco rendirá como HTML
  • static/lpoll.js un cliente basado en jQuery
+2

¡Ah, gracias * tanto * para esto! Voy a echarle un vistazo a tu código esta noche. "Pero, en mi experiencia, encontrar ejemplos buenos y sencillos de implementación del servidor ha sido difícil". es la experiencia exacta que tuve, así que me alegra saber que no estoy solo. ¡¡Gracias de nuevo!! – aaronlevin

+0

FYI Intenté esto primero con bottle.py (con un script de subproceso largo) y obtuve algunos problemas de bloqueo. Con Flask funciona genial. ¡Gracias! – Nate

+0

¿Cómo se sincronizarían varios clientes para que todos reciban la señal al mismo tiempo? – r1d3h4rd

10

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.

Here is an example, similar al anterior, pero que integra Flask y Web Sockets. Se ejecuta encima de los componentes del servidor desde 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.

Cuestiones relacionadas