2009-04-08 10 views
6

Tengo un script de python que se ejecuta continuamente. Emite 2 líneas de información cada 30 segundos. Me gustaría poder ver esta salida en la web. En particular, me gustaría que el sitio se actualice automáticamente (agregue el nuevo resultado en la parte superior de la página/sitio cada 30 segundos sin tener que actualizar la página).¿Cuál es la forma más sencilla de obtener resultados de scripts de Python en la web?

Entiendo que puedo hacer esto con javascript, pero ¿hay una solución basada solo en Python? Incluso si lo hay, ¿es javascript el camino a seguir? Estoy más que dispuesto a aprender javascript si es necesario, pero si no, me gustaría centrarme en Python.

Disculpe la pregunta básica, pero todavía no tengo ni idea acerca de la programación web.

Thx!

+0

Realmente aprecio todas las respuestas. Esto es solo una cuestión de conveniencia, no un sitio para el consumo público. Sospecho que terminaré yendo a la ruta javascript pero también exploraré las otras opciones. – timepilot

+0

Después de investigar un poco y leer todos los comentarios a continuación, usar javascript/jquery parece ser el camino a seguir. La opción html meta refresh tag funciona para mí (¡¡¡thx !!) pero visualmente estoy buscando algo así como la versión beta de friendfeed o gmail. Si alguien tiene alguna sugerencia sobre el frente, por favor avíseme. Thx otra vez por la ayuda – timepilot

Respuesta

5

Esta pregunta parece tener dos cosas.

  1. Presentación en la web. Esto es fácil de hacer en Python: use Django o TurboGears o cualquier framework web basado en Python.

  2. de actualización de la página Web para mostrar los nuevos datos. Esto se puede hacer de dos maneras.

    • Algunas fantasías Javascript para actualizar.

    • HTML sofisticado para actualizar la página. La etiqueta meta refresh es lo que desea. Si haces esto, tienes una solución de Python completa.

+0

¿Por qué no lavar buffers entre las salidas? – reggie

1

JavaScript es la forma principal de agregar este tipo de interactividad a un sitio web. Puedes hacer el Python de back-end, pero el cliente tendrá que usar llamadas de JavaScript AJAX para actualizar la página. Python no se ejecuta en el navegador, por lo que no tienes suerte si quieres usar solo Python.

(También es posible usar Flash o Java applets, pero eso es una solución de peso pesado bastante por lo que parece un pequeño problema.)

1

Es necesario Javascript en una forma u otra para su segundo 30 refresco. Alternativamente, puede establecer una actualización de metaetiqueta por cada 30 segundos para redirigir a la página actual, pero la ruta de Javascript evitará que la página parpadee.

2

Usted podría utilizar Comet, pero te desalentar fuertemente de hacerlo. Solo escribiría un breve Javascript, usando jQuery esto es muy sencillo.

Otra posibilidad es el uso de un iframe que vuelve a cargar cada 30 segundos, esto evitaría que toda la página de recarga.

2

Si desea hacerlo por completo en Python puede utilizar pyjamas.

Genera javascript directamente del código python, por lo que evita escribir javascript usted mismo por completo.

0

¿Esto es para una verdadera aplicación web? ¿O es esto algo conveniente para que veas la salida en el navegador? Si es más por conveniencia, podrías considerar usar mod_python.

mod_python es una extensión para el servidor web Apache que incorpora un intérprete de Python en el servidor web (por lo que el script se ejecuta en el servidor). Le permitiría fácilmente hacer este tipo de cosas a nivel local o por su propia conveniencia. Luego, podría ejecutar el script con mod python y hacer que el controlador publique sus resultados. Probablemente también puedas implementar fácilmente la actualización, pero no sabría cómo hacerlo.

Espero que esto ayude ... echa un vistazo a mod_python. No es tan malo una vez que tienes todo configurado.

1

Escribe tu salida a un archivo de registro, y cargar el archivo de registro para el navegador a través del servidor web. Si necesita actualización automática, crear un archivo HTML con la etiqueta de plantilla para actualizar cada 15 segundos:

<META HTTP-EQUIV="refresh" CONTENT="15"> 

y utilizar server side include para incluir el archivo de registro en la página.

3

Si quieres una manera completamente simple de imprimir datos desde un script de Python a una página web y actualizarlos automáticamente, puedes simplemente imprimir desde el script. Por ejemplo, el uso de Apache con el siguiente Python script CGI:

#!/usr/bin/python 

import time 
import sys 
import random 

def write(inline=''): 
    sys.stdout.write(inline) 
    sys.stdout.write('\r\n') 
    sys.stdout.flush() 

#prints out random digits between 1 and 1000 indefinitely 
write("Content-type: text/html\r\n") 
i = 0 
while(True): 
    i = i + 1 
    time.sleep(1) 
    write(str(i) + "<br />") 

Si navego a que en un navegador (Firefox, no sé si otros navegadores pueden funcionar de forma diferente en lo que respecta a amortiguar etc), imprime el dígitos continuamente Eso sí, imprime en orden secuencial para que los datos más nuevos estén en la parte inferior en lugar de en la parte superior, pero podría funcionar dependiendo de qué es lo que estás buscando hacer exactamente.

Si esto no es realmente lo que está buscando, la única manera de hacer esto es una página de actualización automática (ya sea en un iframe, o toda la página) o con javascript para hacer el ir a buscar los datos.

Puede usar una metaetiqueta en su iframe o fuente HTML de página, y su CGI puede imprimir los datos nuevos cada vez que se actualicen. Alternativamente, puede usar javascript con XMLHTTPRequest para leer los datos nuevos sin una actualización visual de la página.

+0

Esto se llama Comet, pero no se garantiza que funcione con todos los navegadores. (Y puede haber problemas de tiempo de espera). –

+0

Todos los puntos buenos, realmente solo depende de los detalles de lo que el OP estaba buscando. Creo que una pizca de javascript sería la mejor solución. – Jay

+0

Con 'while (i <10)', en la página web, muestra toda la salida al final, no los niveles intermedios, que es en tiempo real. ¿Alguna manera de imprimir uno por uno, no todos al final? – npatel

1

Quizás "long polling" es lo que estás buscando?

El sondeo largo podría describirse como "HTTP push", básicamente tiene un script (Python) servido a través de un servidor web, que solo genera datos cuando están disponibles. Luego intenta cargar esta página de forma asíncrona a través de Javascript, cuando falla, vuelva a intentarlo, cuando tenga éxito, haga algo con los datos (visualícelo, generalmente)

Los ejemplos en my answer están en PHP, pero solo son realmente 2 comandos (sleep(rand(1, 10)) - los otros pocos son para demostrar el javascript manejo de errores)

Bueno, no es bastante así de simple ... No se puede simplemente servir un script python CGI a través de Apa che, porque se quedará sin trabajadores-hilos, y el servidor web no será capaz de aceptar cualquier conexión más .. Por lo tanto, es necesario utilizar un servidor más especializado ..

  • El marco Python twisted es perfecto para este tipo de servidores - los dos servidores siguientes son por cierto ambas escritas con él
  • cometd - la cosa servidor de votación larga "más famoso", aunque nunca he tenido mucha suerte con la implementación de Python
  • slosh - parece sumamente sencilla usar..Implementado en Python, aunque puede interactuar con él a través de solicitudes HTTP
Cuestiones relacionadas