我使用以下PLone + urllib代码通过BrowserView代理来自其他服务器的响应
req = urllib2.Request(full_url)
try:
# Important or if the remote server is slow
# all our web server threads get stuck here
# But this is UGLY as Python does not provide per-thread
# or per-socket timeouts thru urllib
orignal_timeout = socket.getdefaulttimeout()
try:
socket.setdefaulttimeout(10)
response = urllib2.urlopen(req)
finally:
# restore orignal timeoout
socket.setdefaulttimeout(orignal_timeout)
# XXX: How to stream respone through Zope
# AFAIK - we cannot do it currently
return response.read()
我的问题是,当第一个字节到达时,我怎么能使这个功能不阻止并立即开始通过Zope流式传输代理响应?当接口,对象或模式用于制作流式Zope响应时?
答案 0 :(得分:5)
我认为有两种方法可以做到这一点。首先, Zope 响应本身就像文件一样,因此您可以使用响应的write()
方法在响应进入时将连续的数据块写入。Here's an example我在哪里使用Zope响应作为csv.writer的类文件对象。
或者您可以使用ZPublisher's IStreamIterators并将响应包装在ZPublisher.Iterators.filestream_iterator
包装器中并返回包装器。
答案 1 :(得分:0)
这实际上应该是一个评论,但我还没有声誉。 我正在尝试做与Mikko相同的事情,而RESPONSE.write()确实如此,正如Ross所说的那样。但请注意,在它们有64K(或连接关闭)之前,字节实际上不会离开接口。刷新标准输出没有帮助,所以你似乎不得不进一步干扰套接字以立即发送几个字节。