我正在尝试使用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选项。但是当后端服务器禁用分块响应时,回调不会被调用。
如何处理大量内容?
感谢。
答案 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()
更新:现在是一个完整的示例程序。