Wyświetl wynik na stronie internetowej, gdy tylko dane będą dostępne na serwerze

Piszę stronę cgi w Pythonie. Powiedzmy, że klient wysyła żądanie do mojej strony cgi. Moja strona cgi wykonuje obliczenia i gdy tylko otrzyma pierwsze wyjście, odsyła to wyjście do klienta, ale tak się stanieDALEJ wykonać obliczenia i wysłać inne odpowiedziPO pierwsza odpowiedź zostanie wysłana.

Czy to, co tu przedstawiłem, jest możliwe? Zadaję to pytanie, ponieważ w mojej ograniczonej wiedzy, w odpowiedziach na stronę cgi są wysyłane z powrotem w jednorazowym podstawowym momencie, po wysłaniu odpowiedzi cgi-page przestaje działać. Ta rzecz jest wykonywana po stronie serwera lub po stronie klienta i jak ją wdrożyć?

Mój serwer uruchamia Apache. Dziękuję Ci bardzo.

Na tym forum wypróbowałem kod klienta z „dbr” (dzięki niemu wpadłem na pomysł, jak długo działa).

<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>

A oto mój kod serwera:

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>"

Spodziewam się, że moja strona klienta wyświetli 1 liczbę na raz (0,1,2, ...), ale dane zawsze będą wyświetlane jednocześnie (01234 ...). Pomóż mi to rozgryźć. Bardzo wam dziękuję.

Trochę poza ścieżką, próbuję użyć wtyczki komety jquery, ale nie mogłem znaleźć wystarczającej dokumentacji. Pomoże to być bardzo mile widziane. Jeszcze raz dziękuję: D

[edytuj] Ok, w końcu dzięki waszym przewodnikom udało mi się to sprawić. Masz rację, kiedy przewidujesz, że mod_deflate jest źródłem tego wszystkiego.

Podsumowując, co zrobiłem tutaj:

Dla klienta utwórz długą stronę ankiety jako kod HTML powyżej

W przypadku serwera wyłącz mod_deflate przez: edycję pliku /etc/apache2/mods-available/deflate.conf, skomentuj linię z częścią text / html i zrestartuj serwer. Aby upewnić się, że Python nie buforuje samego wyjścia, dołącz #! / Usr / bin / python -u na początku strony. Pamiętaj, aby używać sys.stdout.flush () po każdym wydruku, który chcesz wyświetlić u klienta. Efekt może nie być przezroczysty, powinien zawierać time.sleep (1), aby przetestować. :RE

Bardzo wam dziękuję za wsparcie i pomoc w rozwiązaniu tego problemu: D

questionAnswers(4)

yourAnswerToTheQuestion