Потоковое состояние скрипта Python на веб-сайт - PullRequest
4 голосов
/ 18 сентября 2010

У меня простой рабочий процесс [Step 0]->[1]->[2]->...->[Step N]. Основная программа знает шаг (состояние), в котором она находится в данный момент.

Я хочу транслировать это в режиме реального времени на веб-сайт (в локальной сети), чтобы, когда мои коллеги открывают, скажем, http://thecomputer:8000, они могли видеть в реальном времени отображение текущего состояния нашего рабочего процесса с любым соответствующие детали.

Я думал о том, чтобы записать состояние сценария в объект StringIO (потоковая передача к нему) и использовать Javascript для обновления браузера, но я, честно говоря, понятия не имею, как на самом деле это сделать.

Любой совет?

Ответы [ 5 ]

1 голос
/ 18 сентября 2010

Вы можете сделать так, чтобы скрипт python написал XML-файл, который вы получили по запросу ajax на своей веб-странице, и получил от него информацию о состоянии.

0 голосов
/ 02 ноября 2017

Вы можете добавить экземпляр сервера в ваше приложение, которое отвечает на запросы на заданном порте с тем, что ваше приложение решит поделиться.Начните с этого в отдельном потоке с доступом к информации о состоянии приложений, затем попросите веб-страницу или программы мониторинга отправлять запросы на этот порт.Конечно, вы можете отвечать на разные запросы по-разному.Вся необходимая информация находится на https://pymotw.com/3/socket/tcp.html, но приведенный ниже код поможет вам начать:

# borrowed from https://pymotw.com/3/socket/tcp.html
import socket
import sys

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to the port
# (the host name used will need to be pingable from the requesting service)
server_address = ('', 10000)
print('starting up on {} port {}'.format(*server_address))
sock.bind(server_address)

# Listen for incoming connections
sock.listen(1)

while True:  # add a terminator based on your application state
    # Wait for a connection
    print('waiting for a connection')
    connection, client_address = sock.accept()
    try:
        print('connection from', client_address)

        # Receive the data in small chunks and retransmit it
        while True:
            data = connection.recv(16)
            # print('received {!r}'.format(data))
            if data:  # add a check to ensure the request is valid
                print('sending data back to the client')
                data = 'Current application state is:' + getStatus()
                connection.sendall(data.encode())
            else:
                print('no data from', client_address)
                break
    finally:
        # Clean up the connection
        connection.close()
0 голосов
/ 18 сентября 2010

Используя простой JavaScript, вы можете выбрать Comet, WebSockets и Ajax.Однако я мало что знаю об этом.Проверьте некоторые из этих веб-сайтов:

http://en.wikipedia.org/wiki/Comet_(programming)

http://www.websockets.org/

Из того, что я знаю, Comet просто включает в себя длительный Ajax-запрос к веб-серверу.где скрипт может выдвигать данные по мере необходимости.WebSockets поддерживаются только в самых последних версиях некоторых браузеров.Самым простым решением было бы то, что предложил Омар Абид: время от времени опрашивать веб-сервер через Ajax.

0 голосов
/ 18 сентября 2010

У меня нет представления о том, как работает Python, но если бы это был PHP, это было бы легко (если вы знаете, что делать).

Допустим, мое приложение myapp.py и оно работает с шага 1 до шага N. Я бы вернул (простой текст) число. Этот номер является его номером шага. Например, если я звоню http://localhost/myapp.py,, он возвращает 5. Через 30 минут я перезагружаю страницу, она возвращает 15.

Теперь о JavaScript. Я буду рекомендовать использовать JQuery. Это делает вещи намного проще и быстрее. Все, что я хотел бы сделать, это

$('#streaming').load('http://localhost/myapp.py');

Это загрузит содержимое страницы в DIV с ID = streaming. Но это произойдет только при загрузке страницы. Чтобы это происходило каждые x секунд, используйте функцию settimeout JavaScript.

var t=setTimeout("javascript statement",milliseconds);

Было бы лучше сохранить часть, которая загружает шаг, в функции и вызывать ее при загрузке страницы с помощью setTimeout. Это также поможет остановить setTimeout, как только ваш скрипт перестанет работать (со специальным номером / сообщением).

0 голосов
/ 18 сентября 2010

Если вы просто какое бы то ни было быстрое решение, а не полноценная веб-страница, посмотрите SimpleHTTPServer Вы можете записать информацию о своем состоянии в виде файла в каталог, и он обновляется для других.видеть.

Не красиво, но очень быстро и очень легко.

Для демонстрации просто введите python -m SimpleHTTPServer Это создаст веб-страницу с адресом http://[your computer's name or IP]:8000 с содержимым текущего рабочего каталога, в котором он находится при запуске.Файлы имеют горячую ссылку.Если вы нажмете на файл, он отобразится в браузере;Если вы щелкнете по каталогу, вы перейдете в этот каталог, и его содержимое отобразится в списке.

Для вашего использования вы можете начать с пустой директории и создавать файлы, которые соответствуют шагам, о которых вы хотите сообщить.Вы можете иметь файлы с именами ваши шаги, например, «step 1.txt», и более подробную информацию внутри этого файла.Шаг 1 может быть каталогом, который ваш сценарий создает по завершении шага 1 и т. Д.

В качестве альтернативы, извлеките Twisted , который позволит вам обслуживать HTTP-запросы от вашего сценария Python напрямую.

Если / когда вы хотите стать более любопытным, вы можете использовать по существу тот же метод.Из вашего скрипта Python вы записываете вывод в файлы в пустой директории.На веб-сервере с PHP напишите тривиальный скрипт, который проверяет этот каталог и отображает найденное.Установите интервал обновления на странице на какое-либо значение, и оно само обновится в браузерах средства просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...