使用代理视图流式传输Zope HTTP响应

时间:2011-08-05 08:11:52

标签: http streaming plone urllib zope

我使用以下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响应时?

2 个答案:

答案 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(或连接关闭)之前,字节实际上不会离开接口。刷新标准输出没有帮助,所以你似乎不得不进一步干扰套接字以立即发送几个字节。