gpt4 book ai didi

python-3.x - 如何在 Python3 上使用 Tornado 代理大内容?

转载 作者:行者123 更新时间:2023-12-02 03:43:36 24 4
gpt4 key购买 nike

我正在尝试在 Python3 上使用 Tornado 实现异步 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 选项。但是当后端服务器禁用分块响应时,不会调用回调。

如何处理大内容?

谢谢。

最佳答案

你应该可以通过max_buffer_sizetornado.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()

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

关于python-3.x - 如何在 Python3 上使用 Tornado 代理大内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18583116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com