在我的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
所以我将请求存储在全局字典中,因此我可以在WebSocketHandler类的request.write()
方法中调用request.finish()
和on_message
:
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()
是在MainHandler类的get方法结束后自动调用的。所以有没有办法让requestHandler继续“等待”,而我没有通过文件调用request.finish()
?
你可能应该反过来处理这个问题;不要存储“请求”,尝试以某种方式保持活动,并从其他地方写入,而是让请求处理程序等待您需要的值。例如。:
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)