2010-07-20 21 views
7

Esta es mi primera pregunta aquí, así que espero que se haga correctamente;)Web-ifing un script de línea de comando python?

Se me ha asignado la tarea de dar una interfaz web a un script python "hecho en casa". Este script se usa para verificar la disponibilidad de algunos sitios web/aplicaciones, a través de comandos Curl. Un aspecto muy importante de este script es que da sus resultados en tiempo real, escribiendo línea por línea en la salida estándar.

Al proporcionar una interfaz web para este script, el objetivo principal es que el script se pueda utilizar fácilmente desde cualquier lugar, por ejemplo, a través de un teléfono inteligente. Por lo tanto, la interfaz web debe ser bastante básica y funcionar sin "plugins".

Mi problema es que la mayoría de las soluciones que pensé o encontré en la web (ajax, django, incluso una publicación simple) parecen necesitar una generación completa de la página antes de enviarla al navegador, perdiendo este importante "real- tiempo "aspecto.

¿Alguna idea sobre cómo hacer esto correctamente?

Gracias de antemano.

+0

Gracias por sus respuestas, estoy actualmente ocupados en otras tareas, pero que debería volver sobre esto pronto ;-) – Lenn

Respuesta

0

Su tarea parece interesante. :-) Un escenario que acaba de recordar: continuamente raspa los recursos con sus scripts de elaboración casera y envía los resultados a su base de datos persistente y a un sistema de almacenamiento en caché, como Redis, de forma simultánea. Su sistema/capa de caché sirve como fuente de datos primaria cuando se atienden solicitudes de clientes. Redis f.e. es un almacén de clave-valor de alto rendimiento que es capaz de manejar 100k conexiones por segundo. Aunque solo la última n (digamos por ejemplo, 50k entradas) importa, el sistema de almacenamiento en caché solo mantendrá estas entradas y le permitirá concentrarse exclusivamente en desarrollar la API del lado del servidor (manejo de conexiones, solicitudes de procesamiento, lectura de Redis) y la interfaz. La comunicación entre frontend y backend-API podría estar impulsada por conexiones WebSocket. Una parte bastante nueva de las especificaciones de HTML5. Aunque, sin embargo, ya es compatible con muchas versiones de navegador lanzadas en estos días. Alternativamente, podría recurrir a algunas cosas asincrónicas Flash Socket. Websockets básicamente permite conexiones persistentes entre un cliente y un servidor; puede registrar el detector de eventos que se llama para cada paquete de datos entrantes, sin interminables sondeos u otras cosas.

3

Un bosquejo de una solución:

crear un archivo HTML que contiene el diseño de su página web, con un DIV dedicado para la salida del script:

<html> 
<body> 
<div id="scriptoutput"></div> 
<script type="text/javascript" src="localhost:8000/runscript"/> 
</body> 
</html> 

Este archivo HTML puede ser servido con cualquier servidor que desee.

Ahora, escribir un simple servidor HTTP que se ejecuta la secuencia de comandos y convierte cada línea a un comando de JavaScript (ejemplo en Python):

import os 
f = os.popen('ping 127.0.0.1') 
for i in range(30): 
    ln = f.readline() 
    print "document.getElementById('scriptoutput').innerHTML += '<pre>%s</pre><br/>';" % ln 

Se puede utilizar cualquier servidor de CGI/WSGI para la tarea, o si el rendimiento no es crucial, incluso usa la propia clase de Python BaseHTTPServer.

Esto haría el truco, ya que la mayoría de los navegadores analizan y ejecutan scripts Javascript a medida que se reciben (y no solo cuando se completa la solicitud): ¡tenga en cuenta que no es necesario el sondeo ni el servidor!

+0

he demostrado python2.7 server.py script de ejecución y modificado para servir el directorio de scripts sin parámetros y el código html como index.html. que ejecuta el código python y ha obtenido un error: archivo "D: /test/javascr.py", línea 4, en ln = f.readline() AttributeError: 'tupla' objeto no tiene atributo 'readline' Y el navegador mostró la página en blanco. algo debe estar perdido. ¿Dónde poner el nombre del script python para ejecutar, por ejemplo, digamos imprimir simplemente "Hola mundo"? –

+0

lo siento, debería haber sido popen en lugar de popen2 - corregido. – adamk

0

Espero que entienda su necesidad correctamente.

La idea detrás de Ajax es actualizar el contenido de la página sin tener que volver a cargar toda la página. Creo que debería corresponder a tu necesidad. Puede que tenga que modificar sus comandos si desea publicarlos en la web.Es posible que necesite obtener sus registros de impresión "sobre la marcha".

Aquí están algunas ideas:

  1. escribir una página muy sencilla con la posibilidad de ejecutar comandos (menú, forma ...)

  2. Cuando el usuario pide una ejecución de comandos, enviar una consulta ajax al servidor que ejecuta el comando.

  3. Sus comandos deben modificarse para redirigir sys.stdout a algo que almacena los registros de impresión en una base de datos. Puede hacerlo asignando al sys.stdout un objeto con una función write.

    class MyDbLogger: 
        def __init__(self, ...): 
         """Some initialization""" 
         ... 
    
        def write(self, s): 
         """write into the database""" 
         ... 
    
    dbout = MyDbLogger(...) 
    sys.stdout = dbout 
    
  4. El cliente que consulte el servidor regurlarly para obtener el contenido en la base de datos y luego escribirlo en la página.

  5. Comet es sin duda la tecnología a investigar para tener un comportamiento en tiempo real. Eso evitará que el cliente haga sondeos en el servidor de forma regular. Eso puede ser una mejora al # 4 pero puede ser un poco más difícil de implementar.

espero que ayude

Cuestiones relacionadas