Веб-сценарий сценария командной строки python?

Это мои первые вопросы, поэтому я надеюсь, что это будет сделано правильно;)

Мне была назначена задача предоставить веб-интерфейс для какого-то «домашнего» сценария python. Этот скрипт используется для проверки доступности некоторых веб-сайтов / приложений с помощью команд curl. Очень важным аспектом этого скрипта является то, что он дает свои результаты в режиме реального времени, записывая строки за строкой на стандартный вывод.

Предоставляя веб-интерфейс для этого скрипта, главная цель заключается в том, что сценарий можно легко использовать из любого места, например, через смартфон. Таким образом, веб-интерфейс должен быть довольно простым и работать «без плагинов».

Моя проблема заключается в том, что большинство решений, которые я думал или нашел в Интернете (ajax, django, даже простой пост), похоже, нуждаются в полном генерации страницы перед отправкой в ​​браузер, теряя этот важный аспект «в реальном времени».

Любая идея о том, как это сделать правильно?

Заранее спасибо.

Эскиз для решения:

Создайте HTML-файл, который содержит макет вашей веб-страницы, с выделенным DIV для вывода скрипта:

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

Этот HTML-файл можно обслуживать с любого сервера.

Теперь напишите простой http-сервер, который запускает скрипт и преобразует каждую строку в команду javascript (пример в 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 

Вы можете использовать любой сервер CGI / WSGI для задачи, или если производительность не имеет решающего значения, даже используйте собственный класс BaseHTTPServer Python.

Это сделало бы трюк, так как большинство браузеров анализируют и выполняют скрипты Javascript по мере их получения (и не только после завершения запроса) – обратите внимание, что не требуется опрос или серверная память!

Ваша задача звучит интересно. 🙂 Сценарий, который только что пришел в голову: вы постоянно очищаете ресурсы своими сценариями домашнего пива и подталкиваете результаты в свою постоянную базу данных и систему кеширования – например, Redis – одновременно. Ваша кеширующая система / уровень служит основным источником данных при обслуживании клиентских запросов. Redis fe – высокопроизводительное хранилище ключей, способное обрабатывать 100 тыс. Соединений в секунду. Хотя только n последних (скажем, fe 50k записей) имеют значение, то система кэширования будет удерживать эти записи и будет только сосредоточена на разработке API-интерфейса на стороне сервера (обработка соединений, обработка запросов, чтение из Redis) и интерфейс. Связь между интерфейсом и backend-API может управляться соединениями WebSocket. Довольно новая часть спецификации HTML5. Хотя, однако, уже поддерживается многими версиями браузеров, выпущенными в эти дни. В качестве альтернативы вы можете отказаться от некоторых асинхронных флэш-файлов Socket. Websockets в основном позволяют поддерживать постоянные соединения между клиентом и сервером; вы можете зарегистрировать прослушиватель событий, который вызывается для каждого входящего пакета данных / -пакета – без бесконечного опроса или другого материала.

Надеюсь, что я правильно понимаю вашу потребность.

Идея Ajax заключается в обновлении содержимого страницы без перезагрузки всей страницы. Я думаю, это должно соответствовать вашей потребности. Возможно, вам придется изменить свои команды, если вы хотите их перенести. Возможно, вам понадобится получить свои журналы печати «на лету».

Вот несколько идей:

  1. Напишите очень простую страницу с возможностью выполнения команд (меню, формы …)

  2. Когда пользователь запрашивает выполнение команды, отправьте запрос ajax на сервер, который выполняет команду.

  3. Ваши команды должны быть изменены, чтобы перенаправить sys.stdout на то, что хранит журналы печати в базе данных. Вы можете сделать это, назначив sys.stdout объект с функцией write .

     class MyDbLogger: def __init__(self, ...): """Some initialization""" ... def write(self, s): """write into the database""" ... dbout = MyDbLogger(...) sys.stdout = dbout 
  4. Клиент будет опробовать сервер регулярно, чтобы получить содержимое в базе данных, а затем записать его на страницу.

  5. Комета, безусловно, является технологией исследования, чтобы иметь поведение в реальном времени. Это позволит избежать регулярного опроса сервера. Это может быть улучшением до # 4, но может быть немного сложнее реализовать.

Я надеюсь, что это помогает