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

3
我正在使用以下的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个回答

5
我认为有两种方法可以实现这个。首先,Zope 响应本身就类似于文件,因此您可以使用响应的 write() 方法,将连续的数据块写入响应中。在这个例子中,我使用 Zope 响应作为 csv.writer 的文件对象。
或者,您可以使用ZPublisher's IStreamIterators 并将响应包装在 ZPublisher.Iterators.filestream_iterator 包装器中并返回该包装器。

两个链接现在都失效了。 - transistor09

0

这实际上应该是一条评论,但我还没有足够的声望。 我正试图做和你Mikko一样的事情,RESPONSE.write()正好能做到这一点,正如Ross所说的那样。请注意,直到有64000个字节(或连接关闭)才会实际离开接口。刷新stdout也没用,因此似乎你必须在套接字下方进一步干预,以便立即发送一些字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接