Если sys.stdout.flush () не сработала, проблема, скорее всего, будет решена путем передачи с чанк-кодированием.
Чтобы дать немного фона, chunked-кодирование определяет механизм, при котором сервер заранее сообщит клиенту: «Мой поток данных не имеет ограничений», и в качестве эффективности данные передаются порциями, а не просто потоковое содержимое волей-неволей.
Вот простой пример, важно то, как вы отправляете данные и используемые вами заголовки.
Другим аспектом этого является то, что браузер на самом деле делает с данными, как они поступают, даже если ваш cgi отправляет данные в браузер, он может просто сидеть на нем, пока это не будет сделано.
В следующем примере curl показывает, что каждый «чанк» правильно загружается в потоке, Safari все еще зависает, ожидая завершения CGI.
#!/usr/bin/python
import time
import sys
def chunk(msg=""):
return "\r\n%X\r\n%s" % ( len( msg ) , msg )
sys.stdout.write("Transfer-Encoding: chunked\r\n")
sys.stdout.write("Content-Type: text/html\r\n")
for i in range(0,1000):
time.sleep(.1)
sys.stdout.write( chunk( "%s\n" % ( 'a' * 80 ) ) )
sys.stdout.flush()
sys.stdout.write(chunk() + '\r\n')
Так что, если вы просто подключитесь к этому CGI с помощью браузера, да, вы не увидите никаких изменений - однако, если вы будете использовать методы AJAX и настраивать обработчик каждый раз, когда получаете данные, вы сможете их «передавать» в потоковом режиме. как оно приходит.