Отображать результат на веб-странице, как только данные будут доступны на сервере
Я пишу страницу CGI в Python. Допустим, клиент отправляет запрос на мою страницу cgi. Моя cgi-страница выполняет вычисления и, как только она получает первый вывод, отправляет этот вывод клиенту, ноПРОДОЛЖИТЬ сделать расчет и отправить другие ответыПОСЛЕ первый ответ отправлен.
Возможно ли то, что я здесь представил? Я задаю этот вопрос, потому что, насколько мне известно, на странице cgi ответы отправляются обратно на однократной основе, после отправки ответа cgi-страница перестает работать. Это сделано на стороне сервера или на стороне клиента, и как мне это реализовать?
Мой сервер работает под управлением Apache. Большое спасибо.
Я попробовал клиентский код из "dbr" на этом форуме (благодаря ему я понял, как долго работает опрос).
<html>
<head>
<title>BargePoller</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css" media="screen">
body{ background:#000;color:#fff;font-size:.9em; }
.msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid}
.old{ background-color:#246499;}
.new{ background-color:#3B9957;}
.error{ background-color:#992E36;}
</style>
<script type="text/javascript" charset="utf-8">
function addmsg(type, msg){
/* Simple helper to add a div.
type is the name of a CSS class (old/new/error).
msg is the contents of the div */
$("#messages").append(
"<div class='msg "+ type +"'>"+ msg +"</div>"
);
}
function waitForMsg(){
/* This requests the url "msgsrv.php"
When it complete (or errors)*/
$.ajax({
type: "GET",
url: "msgsrv.php",
async: true, /* If set to non-async, browser shows page as "Loading.."*/
cache: false,
timeout:50000, /* Timeout in ms */
success: function(data){ /* called when request to barge.php completes */
addmsg("new", data); /* Add response to a .msg div (with the "new" class)*/
setTimeout(
'waitForMsg()', /* Request next message */
1000 /* ..after 1 seconds */
);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
addmsg("error", textStatus + " (" + errorThrown + ")");
setTimeout(
'waitForMsg()', /* Try again after.. */
"15000"); /* milliseconds (15seconds) */
},
});
};
$(document).ready(function(){
waitForMsg(); /* Start the inital request */
});
</script>
</head>
<body>
<div id="messages">
<div class="msg old">
BargePoll message requester!
</div>
</div>
</body>
</html>
И вот мой код сервера:
import sys
if __name__ == "__main__":
sys.stdout.write("Content-Type: text/html\r\n\r\n")
print "<html><body>"
for i in range(10):
print "<div>%s</div>" % i
sys.stdout.flush()
print "</body></html>"
Я ожидаю, что на моей клиентской странице будет отображаться по 1 номеру за раз (0,1,2, ...), но данные всегда появляются сразу (01234 ...). Пожалуйста, помогите мне разобраться. Большое спасибо, ребята.
Просто немного не в себе, я пытаюсь использовать плагин кометы jquery, но я не смог найти достаточно документации. Помогает, будет высоко ценится. Еще раз спасибо: D
[править] Хорошо, ребята, наконец-то, благодаря вашим руководителям, мне удалось заставить его работать. Вы правы, когда предсказываете, что mod_deflate является источником всего этого.
Подводя итог, что я сделал здесь:
Для клиента сделайте длинную страницу опроса в виде HTML-кода выше
Для сервера отключите mod_deflate: отредактируйте файл /etc/apache2/mods-available/deflate.conf, закомментируйте строку с частью text / html и перезапустите сервер. Чтобы Python не буферизировал сам вывод, включите #! / Usr / bin / python -u в начале страницы. Не забудьте использовать sys.stdout.flush () после каждой печати, которую вы хотите отобразить на клиенте. Эффект может быть не прозрачным, должен включать time.sleep (1) для тестирования. : D
Спасибо вам, ребята, за поддержку и помощь в решении этой проблемы: D