1

Я работаю над простым веб-приложением, которое выполняется с угловым и вишневым (прототипирование на данный момент). Я загружаю два файла, а затем вызываю внешнюю программу python внутри cherrypy для их обработки, используя подпроцесс (popen). Я могу это сделать до сих пор. То, что я хочу достичь, - это выход внешней программы (которую я поймаю через popen), переданной клиенту. Моя проблема в том, что я пытаюсь настроить сервер отправил события на cherrypy и не имеет успеха.Как настроить события, переданные сервером cherrypy

Вот мой метод CherryPy Я обнажая (пример одного из Интернета):

@cherrypy.expose 
def getUpdate(self): 
    #Set the expected headers... 
    cherrypy.response.headers["Content-Type"] = "text/event-stream;charset=utf-8" 
    def content(): 
     yield "Hello," 
     yield "world" 
    return content() 

А вот Javascript код клиента (я CO включен и работаю):

var sseEvent = new EventSource('http://localhost:8090/getUpdate'); 
sseEvent.onmessage = function (event) { 
    console.log(event); 
}; 
sseEvent.onopen = function (event) { 
    //console.log("I have started..."); 
}; 

Я посмотрел на это question и в этом blog. Тем не менее, событие onmessage на объекте EventSource не запускается при вызове функции со стороны сервера. Я понимаю, что вы можете вызвать функцию со стороны сервера, и она поймает событие из браузера. Я ошибаюсь или неправильная установка?

ответ

2

Итак, я понял, что с SSE мне нужно отправить данные в определенном формате. т.е.

  • данные: "Foo \ п \ п"

или JSON

  • data: "{\n data: "msg" : "foo", \n data: "id" : "boo", \n data: "}\n\n

То, что я хотел был формат повторных попыток, чтобы сохранить опросом сервера через n секунд. Таким образом, функция CherryPy сейчас:

@cherrypy.expose 
def getUpdate(self, _=None): 
    cherrypy.response.headers["Content-Type"] = "text/event-stream;charset=utf-8" 
    if _: 
     data = 'retry: 200\ndata: ' + str(self.prog_output) + '\n\n' 
     return data 
    else: 
     def content(): 
      data = 'retry: 200\ndata: ' + str(self.prog_output) + '\n\n' 
      return data 
     return content() 

getUpdate._cp_config = {'response.stream': True, 'tools.encode.encoding':'utf-8'} 

, где сообщение отправлено сейчас с

'Retry: п микросекунд'

Это будет отправлены данные каждые п микросекунд. Теперь событие EventSource onmessage запускается, и я с радостью читаю вывод из программы, отправленной с сервера. :)

Хорошо прочитано для SSE (как упоминалось во многих сообщениях): here