Как ждать вызова request.finish () в Python / Tornado - PullRequest
0 голосов
/ 24 апреля 2019

В моем файле python у меня есть два класса обработчиков: MainHandler (tornado.web.RequestHandler) и WebSocketHandler (tornado.web.WebSocketHandler).В классе MainHandler я делаю следующий код в методе get:

class MainHandler(tornado.web.RequestHandler):
   #some code
   def get(self):
      #some code
      mainHandler_dict[chan] = self
      await self.finish() #line of code that would do the waiting somehow

Поэтому я сохраняю запрос в глобальном словаре, чтобы я мог вызывать request.write() и request.finish() в методе on_messageкласс WebSocketHandler:

class WebSocketHandler(tornado.websocket.WebSocketHandler):
   def on_message(self, message):
      #some code 
      request.write(body)
      request.finish()

Я получаю переменную «request» из глобального словаря и пытаюсь вызвать write (), но возникает следующая ошибка: RuntimeError: Cannot write() after finish()

Я думаю finish() вызывается автоматически после окончания метода get в классе MainHandler.Так есть ли способ для requestHandler продолжать "ждать", пока я не вызываю request.finish() где-нибудь через файл?

1 Ответ

0 голосов
/ 24 апреля 2019

Вы, вероятно, должны справиться с этим наоборот;не храните «запрос», попытайтесь каким-то образом сохранить его и писать в него откуда-то еще, а просто дайте обработчику запроса подождать, пока значение не станет доступным.Например:

class MainHandler(RequestHandler):
    async def get(self):
        value = await magic()
        self.write(value)

Теперь способ обработки части "magic" немного зависит от того, откуда взято это значение и что находится в вашем распоряжении, но давайте проиллюстрируем это простым Future:

async def get(self):
    futures[chan] = asyncio.Future()
    value = await futures[chan]
    self.write(value)

И в других местах:

futures[chan].set_result(42)
...