Twisted: уведомлять клиента о завершении процесса на стороне сервера

#twisted #comet #long-polling #notify #multipart-mixed-replace

#twisted #comet #длительный опрос #уведомлять #составная-смешанная-замена

Вопрос:

Я использую Twisted для написания веб-сервера. Одна из задач, выполняемых этим сервером, занимает много времени (~ 5 минут). Я хотел бы иметь возможность эффективно уведомлять клиента о том, что эта задача выполнена.

Я рассматривал возможность использования Comet / long polling, но, хоть убейте, я не могу заставить браузер отображать данные, когда он их получает.

Чтобы создать прототип этого механизма, я написал следующее:

clock.py

 from twisted.internet import reactor, task
from twisted.web.static import File
from twisted.web.server import Site
from twisted.web import server
from twisted.web.resource import Resource
import time

class Clock(Resource):
    def __init__(self):
        self.presence=[]
        loopingCall = task.LoopingCall(self.__print_time)
        loopingCall.start(1, False)
        Resource.__init__(self)

    def render_GET(self, request):
        print "request from",request.getClientIP()
        request.write(time.ctime())
        self.presence.append(request)
        return server.NOT_DONE_YET

    def __print_time(self):
        print "tick"
        for p in self.presence:
            print "pushing data to",p.getClientIP()
            p.write(time.ctime())

root = Resource()
clock = ClockPage()
index = File("index.html")
root.putChild("index.html",index)
root.putChild("clock",clock)
factory = Site(root)
reactor.listenTCP(8080, factory)
reactor.run()
  

index.html

 <html>
<head>
</head>
<body>
<div id="data">Hello</div>
<script type="text/javascript">
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
  if(xhttp.readyState == 4 amp;amp; xhttp.status == 200){
    alert(xhttp.responseText);
    document.getElementById("data").innerHTML=xhttp.responseText;
  }
};
xhttp.open("GET","clock",true);
xhttp.send(null);
</script>
</body>
</html>
  

Что я делал на стороне сервера, так это вызывал request.write со временем, каждую секунду.

На стороне клиента все, что я делаю, это открываю XMLHttpRequest для соответствующего ресурса и сбрасываю responseText непосредственно в div всякий раз, когда .readyState == 4 и .status == 200 .

Проблема в том, что div никогда не перезаписывается, и оповещение никогда не вызывается.

Я продолжаю читать об использовании multipart/x-mixed-replace , но я не совсем уверен, как это использовать. Мы были бы весьма признательны за любые указания на учебные пособия или документацию по реализации такого рода вещей в twisted.

Ответ №1:

Рассмотрите возможность добавления p.finish() в свой цикл, чтобы запрос действительно выполнялся. Текущая реализация будет зависать вечно.

Ответ №2:

Как насчет использования «HTTP streaming» вместо этого? Я успешно использовал его для «потоковой передачи» журналов с сервера в «прослушивающие» браузеры. Вот простая реализация с использованием twisted и немного js:http://codelab.ferrarihaines.com/archives/161

Комментарии:

1. Здесь авторство не раскрывается.