如何在Python3上使用龙卷风代理大内容?

时间:2013-09-03 02:17:18

标签: python-3.x tornado reverse-proxy

我正在尝试使用Python3上的龙卷风实现异步http反向代理。

Handler类如下:

class RProxyHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self):
        backend_url = 'http://backend-host/content.html'   # temporary fixed

        req = tornado.httpclient.HTTPRequest(
                                    url=backend_url)
        http_client = tornado.httpclient.AsyncHTTPClient()
        http_client.fetch(req, self.backend_callback)

    def backend_callback(self, response):
        self.write(response.body)
        self.finish()

当content.html很小时,此代码可以正常工作。但是对于大的content.html,此代码引发了异常:

ERROR:tornado.general:Reached maximum read buffer size

我找到了使用pycurl处理大内容的方法。虽然,它似乎不适用于Python3。

另外,我在HTTPRequest中添加了streaming_callback选项。但是当后端服务器禁用分块响应时,回调不会被调用。

如何处理大量内容?

感谢。

1 个答案:

答案 0 :(得分:1)

您应该能够将max_buffer_size传递给tornado.httpclient.AsyncHTTPClient() 调用以设置最大缓冲区大小。对于50MB缓冲区:

import tornado.ioloop
import tornado.web
from tornado.httpclient import AsyncHTTPClient
from tornado import gen
from tornado.web import asynchronous


class MainHandler(tornado.web.RequestHandler):
    client = AsyncHTTPClient(max_buffer_size=1024*1024*150)

    @gen.coroutine
    @asynchronous
    def get(self):
        response = yield self.client.fetch("http://test.gorillaservers.com/100mb.bin", request_timeout=180)
        self.finish("%s\n" % len(response.body))

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

更新:现在是一个完整的示例程序。