我试图编写一个龙卷风请求处理程序,它生成异步HTTP请求,并在客户端从异步请求接收数据时将数据返回给客户端。不幸的是,我无法让龙卷风返回任何数据到客户端,直到它的所有异步HTTP请求都完成。
下面是我的请求处理程序的演示。
class StreamingHandler(web.RequestHandler): all_requested = False requests = [] @web.asynchronous def get(self): http_client = httpclient.AsyncHTTPClient() self.write('some opening') big_request = httpclient.HTTPRequest(url='[some_big_request]', streaming_callback=self.on_chunk) small_request = httpclient.HTTPRequest(url='[some_small_request]', streaming_callback=self.on_chunk) self.requests.append(http_client.fetch(big_request, callback=self.on_response_complete)) self.requests.append(http_client.fetch(small_request, callback=self.on_response_complete)) self.all_requested = True def on_chunk(self, chunk): self.write('some chunk') self.flush() def on_response_complete(self, response): if self.all_requested and all(request.done() for request in self.requests): self.write('some closing') self.finish()
我希望对这个处理程序的GET请求最初返回文本“some opening”,然后很快为小请求返回“some chunk”,然后为大请求返回“some chunk”(可能多次),最后返回“some closing”,并关闭连接。相反,在建立连接之后,客户端会等待几秒钟,等待所有请求完成,然后在关闭之前立即接收所有HTTPResponse。
我该如何从龙卷风中获得我想要的行为?
提前谢谢!
用gen.coroutine
装饰您的方法,并生成一个未来列表。下面是一个简单的例子:
from tornado import gen, web, httpclient
class StreamingHandler(web.RequestHandler):
@web.asynchronous
@gen.coroutine
def get(self):
client = httpclient.AsyncHTTPClient()
self.write('some opening')
self.flush()
requests = [
httpclient.HTTPRequest(
url='http://httpbin.org/delay/' + str(delay),
streaming_callback=self.on_chunk
) for delay in [5, 4, 3, 2, 1]
]
# `map()` doesn't return a list in Python 3
yield list(map(client.fetch, requests))
self.write('some closing')
self.finish()
def on_chunk(self, chunk):
self.write('some chunk')
self.flush()
请注意,即使请求是“向后”生成的,第一个块仍将在大约一秒钟后被接收。如果同步发送,需要15秒。当您异步请求它们时,只需5分钟。
我见过龙卷风文档和示例,其中self.write方法被广泛用于在超文本标记语言上呈现一些值,其中POST请求在处理程序中运行。但是我找不到关于如何将响应返回给客户的清晰信息。 例如,我正在从我的客户端调用Tornado服务器上的POST请求。接受post请求的代码为: 有了这个,我可以找到cbtp的值,有了,我可以用HTML打印它。但是,相反,我想以JSON格式将这个值返回给客户机,比如我想知道如
我已经建立一个网站一段时间了,我仍然坚持那件事: 我在dbm数据库中为我的网站存储了一些小视频(最多大约400MB),我想在我的网站上播放它们。 我正在使用Tornado python框架手工构建请求处理程序,我想知道如何构建我的处理程序。我从未发现媒体流是如何工作的,也没有在网上找到很多话题。 所以我想要实现的完整结果是在我的网站上有一个网络播放器,在那里我可以请求特定的视频,然后播放它们,而不
问题内容: 我有一个基本的Tornado websocket测试: 我希望能够处理多个连接(似乎已经做到了),而且还能够引用其他连接。我没有一种方法来识别和跟踪单个连接,只是为了能够处理打开连接,接收消息和关闭连接时的事件。 [编辑] 想创建一个dict,其中键是Sec-websocket-key,值是WSHandler对象…。我不确定Sec-websocket-key的可靠性如何。 问题答案:
如何获得我的python龙卷风模块版本的当前版本? 与其他软件包,我可以做到以下几点: 来源:如何检查python模块的版本?
问题内容: 我想用Tornado运行一个用Flask编写的简单应用程序。我该怎么做呢?我想使用Python 2.7和最新的Tornado版本(4.2)。 问题答案: Flask文档用于描述如何执行此操作,但是由于以下性能说明而已被删除。除非所有异步代码都已经用Tornado编写,否则您不需要Tornado来提供Flask应用程序。 关于WSGI的Tornado文档也对此进行了描述。它们还包括一个重
当我阅读tornado源代码时,我希望记录每个接受时间,所以我在上添加一个日志,如下所示: 我的处理程序是一个阻塞函数,它阻塞IOLOOP3S并返回'Hello World'。