Как отобразить вывод скрипта Python в реальном времени на веб-сайте? - PullRequest
3 голосов
/ 25 октября 2009

У меня есть скрипт Python, который выводит что-то каждую секунду или две, но занимает много времени, чтобы закончить полностью. Я хочу настроить веб-сайт таким образом, чтобы кто-то мог напрямую вызывать сценарий, и вывод отправляется на экран во время выполнения сценария.

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

Я не знаю, как называется этот процесс, какие термины я ищу и что мне нужно использовать. CGI? Ajax? Нужно серьезное руководство здесь, спасибо!

Если это имеет значение, я планирую использовать Nginx в качестве веб-сервера.

Ответы [ 5 ]

2 голосов
/ 25 октября 2009

Прежде всего - ваш скрипт должен выводить заголовок:

Соединение: Keep-Alive

Поскольку браузер должен знать, что ему придется ждать.

И ваш скрипт должен выводить данные без буферизации.А stackoverflow уже уже ответил на этот вопрос .

1 голос
/ 25 октября 2009

Решение состоит в том, чтобы очистить буфер вывода в выбранных точках выполнения скрипта - я когда-либо делал это только в PHP через flush (), но это выглядит как эквивалент Python :

cgiprint () также сбрасывает вывод Буфер, используя sys.stdout.flush () . Наиболее серверы буферизуют вывод скриптов пока не закончено. Для длительного бега сценариев, 8 буферизовать вывод расстроить вашего пользователя, который будет удивляться что происходит. Вы также можете регулярно очищайте буфер или запускайте Python в небуферизованном режиме. опция командной строки, чтобы сделать это, -u, который вы можете указать как #!/usr/bin/python -u в твоей линии Шебанга.

0 голосов
/ 17 июня 2012

Как предлагают некоторые другие, вы можете использовать соединение keep alive и вместо операторов "return" используйте операторы yield, а вместо операторов "print" также используйте операторы yield. Это в основном покажет все, что происходит в скрипте python, на страницу веб-сайта.

После тщательного поиска и тестирования я бы посоветовал nginx в качестве обратного прокси-сервера с gevent & bottle в качестве бэкэнда, что обеспечивает душевное спокойствие, поскольку nginx никогда не будет обслуживать исходный файл python.

0 голосов
/ 26 октября 2009

С http://tools.cherrypy.org/wiki/Comet «Википедия описывает Comet как« неологизм для описания модели веб-приложения, в которой длительный HTTP-запрос позволяет веб-серверу передавать данные в браузер без явного запроса браузера ». Другими словами, Comet - это то, что асинхронный Javascript mojo, который вам нужен для создания действительно привлекательных AJAX-приложений.

Следующий код демонстрирует, как написать приложение Comet с использованием CherryPy и jQuery. Это веб-интерфейс в команду ping консоли. Команда ping была выбрана для этого примера, потому что она будет выполняться бесконечно, если не будет аргументов. Выполнение бесконечных команд, как правило, является большим нет-нет, когда дело доходит до программирования веб-приложений, но с CherryPy мы можем справиться с этим довольно легко: "SEE LINK

Я пытаюсь сделать то же самое. Пока что я использую cherrypy, потому что его легко интегрировать с моим скриптом.

0 голосов
/ 25 октября 2009

nginx не поддерживает CGI, поэтому вам нужно будет использовать fastcgi или wsgi

В качестве альтернативы вы можете использовать что-то вроде webpy и прокси к нему через nginx

...