我正试图从我的Pyramid应用程序中流式传输服务器发送的事件(Server-Sent Events),但我无法弄清楚如何从视图(streaming portion)中流式传输响应正文(response body)。这是我正在使用的测试视图(它完全没有实现SSE,只是为了解决流媒体部分):
@view_config(route_name='iter_test')
def iter_test(request):
import time
def test_iter():
i = 0
while True:
i += 1
if i == 5:
raise StopIteration
yield str(time.time())
print time.time()
time.sleep(1)
return test_iter()
这会产生一个错误:ValueError:无法将视图可调用函数 pdiff.views.iter_test 的返回值转换为响应对象。返回值是<generator object test_iter at 0x3dc19b0>。
我尝试使用return Response(app_iter = test_iter())
代替,至少不会出错,但它不会流式传输响应 - 它会等待生成器完成后才将响应返回给我的浏览器。
我知道可以每个请求仅返回单个事件,并允许客户端在每个事件后重新连接,但我更喜欢通过从单个请求中流式传输多个事件来保留服务器发送事件的实时特性,而无需重新连接延迟。如何在Pyramid中实现呢?